楼主现在是大四,在某外包公司已经实习有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              };

 

 

  

    

  

posted on 2013-01-05 10:12  阳光的七夜  阅读(702)  评论(0编辑  收藏  举报