delegates n events
delegates n events
Exception Handling
C# - Delegates
What if we want to pass a function as a parameter?
How does C# handles the callback functions or event
handler?
The answer is - delegate.
The delegate is a reference type data type that defines
the method signature.
You can define variables of delegate, just like other
data type, that can refer to any method with the same
signature as the delegate.
There are three steps involved while working with
delegates:
Declare a delegate
Set a target method
Invoke a delegate
A delegate can be declared using
the delegate keyword.
Delegate Syntax
[access modifier] delegate [return type]
[delegate name]([parameters])
Example: Declare a Delegate
public delegate void MyDelegate(string msg);
we have declared a delegate MyDelegate with a
void return type and a string parameter.
A delegate can be declared outside of the class
or inside the class.
Practically, it should be declared out of the class.
After declaring a delegate, we need to set the
target method or a lambda expression.
We can do it by creating an object of the delegate
using the new keyword and passing a method
whose signature matches the delegate signature.
Example: Set Delegate Target
public delegate void MyDelegate(string msg); // declare a
delegate
// set target method
MyDelegate del = new MyDelegate(MethodA);
// or
MyDelegate del = MethodA;
// or set lambda expression
MyDelegate del = (string msg) => Console.WriteLine(msg);
// target method
static void MethodA(string message)
{
Console.WriteLine(message);
}
You can set the target method by assigning a method
directly without creating an object of delegate e.g.,
MyDelegate del = MethodA.
After setting a target method, a delegate can
be invoked using the Invoke() method or using
the () operator.
Example: Invoke a Delegate
del.Invoke("Hello World!");
// or
del("Hello World!");
Example: Delegate
public delegate void MyDelegate(string msg); //declaring a
delegate
class Program
{
static void Main(string[] args)
{
MyDelegate del = ClassA.MethodA;
del("Hello World");
del = ClassB.MethodB;
del("Hello World");
class ClassB
{
static void MethodB(string message)
{
Console.WriteLine("Called ClassB.MethodB() with
parameter: " + message);
}
}
Multicast Delegate
The delegate can point to multiple methods. A delegate
that points multiple methods is called a multicast
delegate.
The "+" or "+=" operator adds a function to the invocation
list, and the "-" and "-=" operator removes it.
Example: Multicast Delegate
public delegate void MyDelegate(string msg); //declaring a
delegate
class Program
{
static void Main(string[] args)
{
MyDelegate del1 = ClassA.MethodA;
MyDelegate del2 = ClassB.MethodB;
MyDelegate del = del1 + del2; // combines del1 + del2
del("Hello World");
MyDelegate del3 = (string msg) =>
del += del3; // combines del1 + del2 + del3
del("Hello World");
del = del - del2; // removes del2
del("Hello World");
del -= del1 // removes del1
del("Hello World");
}
}
class ClassA
{
static void MethodA(string message)
{
Console.WriteLine("Called ClassA.MethodA() with parameter: " +
message);
}
}
class ClassB
{
static void MethodB(string message)
{
Console.WriteLine("Called ClassB.MethodB() with parameter: " +
message);
}
}
If a delegate returns a value, then the
last assigned target method's value
will be return when a multicast
delegate called.
Example: Multicast Delegate Returning a
Value
public delegate int MyDelegate(); //declaring a delegate
class Program
{
static void Main(string[] args)
{
MyDelegate del1 = ClassA.MethodA;
MyDelegate del2 = ClassB.MethodB;
{ { Console.WriteLine("
class AddTwoNumbers
{
public delegate void dg_OddNumber(); //Declared Delegate
public event dg_OddNumber ev_OddNumber; //Declared
Events
try {
// statements causing exception
} catch( ExceptionName e1 ) {
// error handling code
} catch( ExceptionName e2 ) {
// error handling code
} catch( ExceptionName eN ) {
// error handling code
} finally {
// statements to be executed
}
You can list down multiple catch statements to catch different type
of exceptions in case your try block raises more than one
exception in different situations.
Exception Classes in C#
C# exceptions are represented by classes.
The exception classes in C# are mainly directly
or indirectly derived from
the System.Exception class.
The System.ApplicationException class
supports exceptions generated by application
programs.
The System.SystemException class is the
base class for all predefined system exception.
System.IO.IOException- Handles I/O errors.
System.IndexOutOfRangeException -
Handles errors generated when a method
refers to an array index out of range.
System.ArrayTypeMismatchException-
Handles errors generated when type is
mismatched with the array type.
System.NullReferenceException- Handles
errors generated from referencing a null object.
System.DivideByZeroException - Handles
errors generated from dividing a dividend with
zero.
System.InvalidCastException -Handles
errors generated during typecasting.
System.OutOfMemoryException- Handles
errors generated from insufficient free memory.
System.StackOverflowException-Handles
errors generated from stack overflow.
Handling Exceptions
C# provides a structured solution to the exception
handling in the form of try and catch blocks.
Using these blocks the core program statements
are separated from the error-handling statements.
These error handling blocks are implemented
using the try, catch, and finally keywords.
Following is an example of throwing an exception
when dividing by zero condition occurs −
using System;
namespace ErrorHandlingApplication {
class DivNumbers {
int result;
DivNumbers()
{ result = 0; }
public void division(int num1, int num2) {
try {
result = num1 / num2;
} catch (DivideByZeroException e) {
Console.WriteLine("Exception caught: {0}", e);
} finally {
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args) {
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
Throw keyword