C#匿名委托简单使用
2021-07-15 00:14
标签:运行 两种 简单 class col 并且 caller 面向 rap 委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。 与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。 使用委托工作有两种方式:一种是事先定义好一个方法,然后委托到该方法上,另外一种就是直接在代码中使用匿名方法。 1.直接使用委托 输出 This is the first DelegateFunction! 对委托进行实例化后,委托会将对其进行的方法调用传递到该方法。 调用方传递到委托的参数将传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方, 这被称为调用委托。 实例化的委托可以按封装的方法本身进行调用。 2.使用匿名方法 输出 This is the first DelegateFunction! 3.匿名委托简单比较 输出 This is the first DelegateFunction! 但看下段代码。 第一个printf()输出This is the third DelegateFunction! 第二个printf()输出This is the second DelegateFunction! the_first作为匿名方法外部变量,在未对匿名委托进行实例化时,不执行匿名委托内部操作,所以先输出the third,第一次实例化后执行匿名委托内部操作,the_first变为the second,即输出the second。 4.匿名方法捕获的变量延长其生命周期 输出This tempCount is 1 This tempCount is 1 第一次调用method();之后返回method(),主程序运行至methodInvoker();时,实际上并未执行static MethodInvoker CreateDelegate()中tempCount变量定义,实际上tempCount并不在栈上,编译器创建了一个额外的类来存储变量,CreateDelegate()方法对该类有一个实例引用,所以它可以使用tempCount,而委托也对该实例有一个引用,除非委托准备好被GC回收。 5.匿名方法中局部变量的实例化 输出 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 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 }
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 }
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 }
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 }
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 }
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 }
上一篇:There Are Now 3 Apache Spark APIs. Here’s How to Choose the Right One
下一篇:【转】Windows系统中ckplayer视频边下边放,视频转码mp4及"last atom in file was not a moov atom"问题