楼主现在是大四,在某外包公司已经实习有3个 多月了。其实我专业以前是JAVA开发,临到实习兜兜转转学习windows phone开发了。在学习过程中难免会遇到各种纠结和不懂,所以尝试着写写博客,把自己所学或者所遇到的问题记下来。
wp7代码由两部分组成,一部分是负责UI的xaml文件,一部分是负责后台的.cs文件。在学习过程中,除了学习新的wp7知识外,也暗恨自己上学时不够用心,C#基础不扎实。仅从此篇开始陆陆续续复习有关C#的知识,期待大家的指点。
委托和类一样,是一种用户的自定义类型。类表示的是数据的集合,但是委托表示的是一个或者多个方法。
一、声明委托类型
1. 以delegate关键字开头。
2. 没有方法主体。
例:delegate void MyDel (int x);
MyDel(int x)为签名;void是返回类型;MyDel是委托类型名。
二、创建委托对象并赋值
委托是引用类型。所以有引用和对象。委托可以调用静态方法,也可以调用实例方法。
下面ClassA中的HelloChinese是静态方法;classB是ClassB的对象调用ClassB中的HelloChinese实例方法;
MyDel del1 = new MyDel(ClassA.HelloChinese); MyDel del2 = new MyDel(classB.HelloChinese);
也可以使用快捷语法,如下:
MyDel del1 = ClassA.HelloChinese;
MyDel del2 = classB.HelloChinese;
三、组合委托
MyDel del1,del2,del3; del1 = ClassA.HelloChinese; del2 = classB.HelloChinese; de3=del1+del2; //组合调用委托
为委托增加方法:
MyDel del1,del2,del3; del1 = ClassA.HelloChinese; del1 += classB.HelloChinese;
从委托移除方法:
del1 -=ClassA.HelloChinese;
注:
1)如果调用列表中有多个实例,-=运算符将从列表最后开始搜索,并移除第一个与方法匹配的实例。
2)如果调用列表为空,委托就是空。
3)试图调用空委托会抛出异常。
四、示例
class Program { static void Main(string[] args) { Test test = new Test(); MyDel del = test.HelloChinese; //声明委托并赋值 del += Test.HelloEnglish; //组合委托 del(", Sir!"); //调用委托 Console.Read(); } delegate void MyDel(string str);//定义一个没有返回值的委托 } class Test { public void HelloChinese(string strChinese) { Console.WriteLine("早上好" + strChinese); } public static void HelloEnglish(string strEnglish) { Console.WriteLine("Morning" + strEnglish); } }
输出:
=======
早上好, sir!
morning, sir!
========
五、调用带返回值的委托
1 class Program 2 { 3 static void Main(string[] args){ 4 5 MyClass mc = new MyClass(); 6 MyDelegate mDel = mc.Add2; 7 mDel += mc.Add3; 8 mDel += mc.Add2; 9 Console.WriteLine("Value: {0}",mDel()); 10 } 11 12 class MyClass { 13 int IntValue = 5; 14 public int Add2() { IntValue += 2; return IntValue; } 15 public int Add3() { IntValue += 3; return IntValue; } 16 } 17 delegate int MyDelegate(); 18 }
调用列表中最后一个方法返回的值就是委托调用返回的值。
输出:Value: 12
六、调用带有引用参数的委托
1 class Program 2 { 3 static void Main(string[] args){ 4 MyClass mc = new MyClass(); 5 MyDel mDel = mc.Add2; 6 mDel += mc.Add3; 7 mDel += mc.Add2; 8 9 int x = 5; //ref 变量使用前一定要声明;out不用 10 Console.WriteLine(x); 11 12 Console.Read(); 13 } 14 15 class MyClass { 16 public int Add2(ref int x) { x += 2; return x; } 17 public int Add3(ref int x) { x += 3; return x; } 18 } 19 20 delegate int MyDel(ref int x); 21 }
输出:12
七、匿名方法和Lambda表达式
1 del+=x=>Console.WriteLine("abc{0}",x); 2 del += delegate 3 { 4 Console.WriteLine("{0}" + str1 + str2, value); 5 };