1, 什么是委托?
答:委托即具有相同签名和返回值类型的有序方法列表。
注意:
1> 方法的列表称为调用列表(invocation list)。
2> 当委托被调用时,方法列表中的每一个方法都将被调用。
3> 委托是引用类型数据,因此有引用和对象。
2, 如何声明委托?
delegate void MyDel(int x);
注:
1> delegate为关键字。
2> void表示返回类型,如果有返回值的话就是对应的返回类型,如int。
3> MyDel表示委托名称。
4> MyDel(int x)表示签名。
3, 创建委托对象的两种方法?
方法1:使用带new运算符的对象创建表达式。
MyDel del=new MyDel(ClassA.method1);
方法2:使用快捷语法,仅由类名和方法名构成,使用快捷语法是因为在方法名称和其相应的委托类型之间有隐式转换。
MyDel del=new ClassA.method1;
4, 委托调用?
1> 无返回值和参数的委托调用:
namespace delegate1
{
/*調用無返回值和参数的委托*/
delegate void PrintFunction(); //定義一個沒有返回值和參數的委托類型。
class Program
{
static voidMain(string[] args)
{
Test t = new Test();
PrintFunction pf;//創建一個空委托對象
pf = t.Print1;//初始化委托
pf += Test.Print2;//使用+=運算符為委托增加方法。注意靜態方法的調用方法(類名.方法名)。
pf += t.Print1;
pf += Test.Print2;
if (pf != null)//判斷委托中是否含有方法
{
pf(); //調用委托
}
else
{
Console.WriteLine("委托中沒有任何方法!");
}
Console.ReadKey();
}
}
class Test
{
public void Print1()
{
Console.WriteLine("Print1---實例化方法");
}
public static void Print2()
{
Console.WriteLine("Print2---靜態方法");
}
}
}
程序输出结果为:
2> 带返回值委托的调用:
namespace delegate2
{
/*調用帶返回值的委托*/
/*
1,調用方法列表中最后一個方法返回的值就是委托調用返回的值。
2,調用方法列表中所有其它方法的返回值都會被忽略。
*/
delegate int Mydel();
class Program
{
static voidMain(string[] args)
{
MyClass mc = new MyClass();
Mydel mDel = mc.Add2;
mDel += mc.Add3;
mDel += mc.Add2;
Console.WriteLine("Value:{0}",mDel());
Console.ReadKey();
}
}
class MyClass
{
int IntValue = 5;
public int Add2()
{
IntValue += 2;
return IntValue;
}
public int Add3()
{
IntValue += 3;
return IntValue;
}
}
}
程序输出的结果为:
3> 带引用参数的委托的调用:
namespace delegate3
{
/*調用帶引用參數的委托*/
/*
1,在調用委托列表中的下一個方法時,參數的新值(不是初始值)會傳給下一個方法。
*/
delegate void MyDel(ref int x);
class Program
{
static voidMain(string[] args)
{
MyClass mc = new MyClass();
MyDel mDel = mc.Add2;//Add2(x=5)
mDel += mc.Add3;//Add3(x=7)
mDel += mc.Add2;//Add2(x=10)
int x = 5;
mDel(ref x);
Console.WriteLine("委托mDel的值为:{0}",x);
Console.ReadKey();
}
}
class MyClass
{
public void Add2(ref int x)
{
x += 2;
}
public void Add3(ref int x)
{
x += 3;
}
}
}
程序的输出结果为:
4> 匿名方法和lambda表达式:
匿名方法定义:匿名方法是在初始化委托时内联(inline)声明的方法。
namespace delegate4
{
/*匿名方法和lambda表達式*/
delegate double MyDel(int par);
class Program
{
static voidMain(string[] args)
{
MyDel del = delegate(int x) { return x + 1; };//匿名方法。
MyDel le1 = (int x) => { return x + 1; };//lambda表達式。省略关键字delegate
MyDel le2 = (x) => { return x + 1; };//lambda表达式。省略类型参数,因为编译器可以从委托的声明中知道委托参数的类型。
MyDel le3 = x => { return x + 1; };//lambda表达式。省略圆括号,因为只有一个隐式类型参数。
MyDel le4 = x => x + 1;//lambda表达式。省略语句块。
Console.WriteLine("委托del的值为:{0}", del(12));
Console.WriteLine("委托le1的值为:{0}", le1(12));
Console.WriteLine("委托le2的值为:{0}", le2(12));
Console.WriteLine("委托le3的值为:{0}", le3(12));
Console.WriteLine("委托le4的值为:{0}", le4(12));
Console.ReadKey();
}
}
}
程序输出结果为:
以上是我对委托的理解和总结,各位园友们如果觉得总结得还不错的话请给点鼓励,如果觉得还有不足的地方也欢迎指证,让我们一起努力吧,加油!