标签:运行 两种 简单 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一直是同一实例,所以值++。
标签:运行 两种 简单 class col 并且 caller 面向 rap
原文地址:https://www.cnblogs.com/7haihai/p/9525918.html