C#匿名委托简单使用

2021-07-15 00:14

阅读:1012

标签:运行   两种   简单   class   col   并且   caller   面向   rap   

  委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。             

  与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。

  使用委托工作有两种方式:一种是事先定义好一个方法,然后委托到该方法上,另外一种就是直接在代码中使用匿名方法。

1.直接使用委托

 1         public delegate void Printf(string str);
 2         static void Main(string[] args)
 3         {
 4             Printf printf = DelegateMethod;
 5             printf("This is the first DelegateFunction!");
 6             Console.Read();
 7         }
 8         public static void DelegateMethod(string str)
 9         {
10             Console.WriteLine(str);
11         }

  输出 This is the first DelegateFunction! 对委托进行实例化后,委托会将对其进行的方法调用传递到该方法。 调用方传递到委托的参数将传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方, 这被称为调用委托。 实例化的委托可以按封装的方法本身进行调用。

2.使用匿名方法

 1         public delegate void Printf(string str);
 2         static void Main(string[] args)
 3         {
 4             Printf printf = delegate (string str)
 5             {
 6                 Console.WriteLine(str + "the first DelegateFunction!");
 7             };
 8             printf("This is ");
 9             Console.Read();
10         }

  输出 This is the first DelegateFunction!

3.匿名委托简单比较

 1         public delegate void Printf();
 2         static void Main(string[] args)
 3         {
 4             string this_is = "this is ";
 5             string the_first = "the first ";
 6             Printf printf = delegate ()
 7             {
 8                 Console.WriteLine(this_is + the_first + "DelegateFunction!");
 9             };
10             printf();
11             Console.Read();
12         }    

  输出 This is the first DelegateFunction! 但看下段代码。

 1         public delegate void Printf();
 2         static void Main(string[] args)
 3         {
 4             string the_first = "the first ";
 5             Printf printf = delegate ()
 6             {
 7                 Console.WriteLine("this is " + the_first + "DelegateFunction!");
 8                 the_first = "the second ";
 9             };
10             the_first = "the third ";
11             printf();               
12             printf();
13             Console.Read();
14         }

  第一个printf()输出This is the third DelegateFunction! 第二个printf()输出This is the second DelegateFunction!

  the_first作为匿名方法外部变量,在未对匿名委托进行实例化时,不执行匿名委托内部操作,所以先输出the third,第一次实例化后执行匿名委托内部操作,the_first变为the second,即输出the second。

4.匿名方法捕获的变量延长其生命周期

 1         public delegate void MethodInvoker();
 2         static void Main(string[] args)
 3         {
 4             MethodInvoker methodInvoker = CreateDelegate();
 5             methodInvoker();
 6             Console.Read();
 7         }
 8         static MethodInvoker CreateDelegate()
 9         {
10             int tempCount;
11             MethodInvoker method = delegate
12             {
13                 tempCount = 1;
14                 Console.WriteLine("This tempCount is {0}", tempCount);
15                 tempCount++;
16             };
17             method();
18             return method;
19         }

  输出This tempCount is 1

    This tempCount is 1

  第一次调用method();之后返回method(),主程序运行至methodInvoker();时,实际上并未执行static MethodInvoker CreateDelegate()中tempCount变量定义,实际上tempCount并不在栈上,编译器创建了一个额外的类来存储变量,CreateDelegate()方法对该类有一个实例引用,所以它可以使用tempCount,而委托也对该实例有一个引用,除非委托准备好被GC回收。

5.匿名方法中局部变量的实例化

 1         public delegate void MethodInvoker();
 2         static void Main(string[] args)
 3         {
 4             MethodInvoker newDelegate = CreateDelegate();
 5             newDelegate();
 6             newDelegate();
 7             Console.Read();
 8         }
 9         static MethodInvoker CreateDelegate()
10         {
11             int tempOtherCount = 1;
12             MethodInvoker method = delegate
13             {
14                 int tempCount = 1;
15                 Console.WriteLine("This tempCount is {0}", tempCount);
16                 Console.WriteLine("This tempOtherCount is {0}", tempOtherCount);
17                 tempCount++;
18                 tempOtherCount++;
19             };
20             method();
21             return method;
22         }

  输出    This tempCount is 1

        This tempOtherCount is 1

        This tempCount is 1

        This tempOtherCount is 2

        This tempCount is 1

        This tempOtherCount is 3

  CreateDelegate()内部method();先输出,执行第一个newDelegate();tempCount又被实例化一次赋值为1,执行第二个newDelegate();tempCount再次被实例化一次赋值为1。而tempOtherCount一直是同一实例,所以值++。

  

 

C#匿名委托简单使用

标签:运行   两种   简单   class   col   并且   caller   面向   rap   

原文地址:https://www.cnblogs.com/7haihai/p/9525918.html


评论


亲,登录后才可以留言!