大话委托(一)

/*
 假如实现一个功能,这个功能是在CMD里面打印
 item=1
 item=2
 item=3
 由一个函数执行
 private static void Print(int i)
 {
    Console.WriteLine(i);
 }

 你可以写
 for(int i=1;i<4;i++)
 {
    Print(int i);
 }
 这样当然是可以的但是并不太符合C#的规范,因为C#是面向组件的编程就是说留一个接口给外界(可能是一个方法,
 调用者调用这个方法),调用者就不必写循环来调用了。
 如果调用者就用一个函数
 Counter(1,3 ,...)
 第三参数能传递一个方法就好了 连续在执行这个方法;但是传递的要么是值类型,要么是引用类型,
 方法 是什么类型呢?哈哈,C#给我们提供了一个方法的类型叫做delegate 就是委托登场了 我们可以传递一个方法的“类”
 就像我们传递一个引用类型一样,好我们编写一下代码 声明这个“类”:
 internal delegate void FeedBack(int x),如果实在记不住的话 就想着他是一个“类”
 internal class(delegate) void FeedBack   但是这个“类” 他有参数 就把他当作有“参数的类”吧。
 这个“类”的实例(就是方法) 也必须遵循这个类的规则 就是 void  int x 返回值为空 参数是int类型,
  如果要声明一个类的实例 应该用NEW
 这个委托类也是一样哦 他也NEW 哦...
  FeedBack fb=new FeedBack(); 额?貌似这个类?好像不能执行?他没有 属性啦,方法啦什么的?委托类就是执行方法的嘛
  而且是“一类方法”就是签名和返回值一样的东东啦,好啦,我们给他传递一个方法这个方法和这个委托类有一样的签名和返回
  值。
   FeedBack fb=new FeedBack(FeedBackToConsole);

 好啊,咱们写完了类 俺要传递参数咯,俺有类型咯,俺可以传递哦,但是要有准备工作,要把这个“类” 的实例写出来啊,

 private static void FeedBackToConsole(int value)
 {
     Console.WriteLine("item="+i);
 }
 俺们要传递咯,
 Counter(1,3,  new FeedBack(FeedBackToConsole))      ;
 这一行就是传递 “类的实例” 了 new FeedBack(FeedBackToConsole)语法是否难以理解?
 大家想想 我传递一个实例的时候 如果直接传递 new FeedBack(); 这个只是一个“类”啊!!他不知道执行那个方法,他并没有具体的指向到
 哪个方法啊,我们把方法给他  new FeedBack(FeedBackToConsole))    ;
 好了万事俱备,只欠东风了,写Counter方法吧


 private void Counter(int from ,int to ,FeedBack fb)
 {
     for(int val=from ;val<=to;val++)
     {
        
     }
 }

  又蒙了吗?

  主要在

     if (fb!=null)
          {
              fb(val);                 
          }
   这里吧?

    fb(val); 这里吧?
    
    fb是我传递的一个实例,就是说fb指向这个实例的方法 我就可以用fb代替 FeedBackToConsole方法了啊     ,因为直接传递
    一个方法是不行的 我传递一个类的实例 这个实例指向这个方法。源代码如下,仔细研究吧。

 */

 

  using System;
 

 namespace FeedBack
 {
    
    
     public class Program
     {
     internal delegate void FeedBack(int value);
     public static void Main()
     {
       StaticDelegateDemo();
     }
 
     private static void StaticDelegateDemo()
     {
         Console.WriteLine("--------start------------");
         Counter(1,3,new FeedBack(Program.FeedBackToConsole));//可以直接写     FeedBackToConsole
         Console.WriteLine("--------end------------");
     }

     private static void Counter(int from ,int to ,FeedBack fb)
     {
         for(int val=from;val<=to;val++)
         {
             if(fb!=null)
             {
                 fb(val);
             }
         }
     }

     private static void FeedBackToConsole(int value)
     {
         Console.WriteLine(value);
     }
     }

    


 }
posted @ 2011-12-06 11:45  fox_ice  阅读(120)  评论(0)    收藏  举报