delegate

快速理解C#高级概念(一) Delegate委托

…衆ロ難τιáo~ 提交于 2020-01-05 05:12:13
做.NET开发很久,最近重新温习《C#高级编程》一书。发现很多曾经似懂非懂的问题,其实也是能够慢慢钻研慢慢理解的。 所以,打算开写《C#高级编程系列》博文。其中会借鉴《C#高级编程》一书的概念,也会参照其他高手的博文,希望大家谅解。有不对的地方,欢迎指正。 (另:本博文不会讲解定义,语法方面的基础知识。) 下面如题,我们来讲委托。 Delegate委托,在.NET中应用的非常广泛。会涉及到Lambda表达式,事件,匿名方法等(请关注后续博文)。 那么何为委托? 通俗的来讲,委托除了必须指定delegate关键字和没有方法实体之外,和指定方法没有更多区别。你可以当它是一个占位符,比如你在写代码的时候并不知道你将要处理的是什么。你只需要知道你将要引入的参数类型和输出类型是什么并定义它即可。这就是书本上所传达的方法签名必须相同的意思。 下面我们来定义一个基本的委托: 1 public class Test 2 { 3 //定义委托 4 public delegate void D_Math(int a, int b); 5 public void Add(int a, int b) 6 { 7 Console.WriteLine("Add方法结果:{0}", a + b); 8 } 9 public void Cut(int a, int b) 10 { 11 Console

C# Foundation

依然范特西╮ 提交于 2020-01-03 23:21:25
一、值类型 1. 数值 整数字面量: int x = 100; //decimal notationlong y = 0x7F; //hexadecimal notation 实数字面量: double x = 1.5; //decimal notationdouble y = 1E06; //exponential notation 数值字面量类型推定: 如果数值字面量包含一个小数点或者包含指数部分(E),则为 double 类型。 否则,数值字面量是下面第一个能适配的类型: int , uint , long , ulong 。 数值字面量后缀: float f = 1.0F;double d = 1D;decimal m = 1.0M;uint u = 1U;ulong ul = 1UL; 特殊Float值: float.NaN float.PositiveInfinity float.NegativeInfinity -0.0F 特殊Double值: double.NaN double.PositiveInfinity double.NegativeInfinity -0.0 2. 字符 字符字面量: char c = 'A'; 字符转义序列: \' Single quote \" Double quote \\ Backslash \0 Null \a Alert \b

委托, 匿名委托, Lambda表达式, 事件的本质, 以及Observer模式.

折月煮酒 提交于 2020-01-03 16:44:50
1.委托的本质 委托实现了面向对象的,类型安全的方法回调机制。委托看上去就一句话, 很简单, 但在本质上它是一个类,CLR和编译器在后台会将委托自动编译为一个类. 该类继承自System.MulticastDelegate类,该类维护一个委托列表,在调用多播委托时,将按照委托列表的委托顺序而调用的。该类包括一个接受两个参数的构造函数和3个重要方法:BeginInvoke、EndInvoke和Invoke。 下面是delegate委托的父类MulticastDelegate的部分代码: public abstract class MulticastDelegate : Delegate { public sealed override Delegate[] GetInvocationList(); // Overloaded operators. public static bool operator ==(MulticastDelegate d1, MulticastDelegate d2); public static bool operator !=(MulticastDelegate d1, MulticastDelegate d2); // Used internally to manage the list of methods maintained by the

C# 匿名方法

亡梦爱人 提交于 2020-01-03 16:44:30
在C#1.1里,声明和使用委托要求你有委托和一个在委托被触发时具有匹配签名的能够执行的方法,以及一个将命名方法与委托关联的分配语句。 namespace 匿名方法示例 { /// <summary> /// C# 1.X中委托使用方法 /// </summary> class Program { // 1. 声明 委托Sample delegate int Sample(int x, int y); // 2. 声明 与委托Sample 签名匹配的 方法Plus static int Plus(int x, int y) { return x + y; } static void Main(string[] args) { // 3. 将委托Sample 与 方法Plus 进行关联 Sample f =new Sample(Plus); int result = f(1, 2); Console.WriteLine(result); } } } 在C#2.0里,引入了匿名方法这个新特性,它允许开发者内联(inline)声明自己的函数代码而无须使用委托函数(delegate function)。匿名方法基本省能够提供与先前命名方法相同的功能,但是它已经不在需要一个在关联到委托之前就明确创建的方法了。当编译器遇到匿名方法时,编译器会在类里面创建一个命名方法

Delegate

▼魔方 西西 提交于 2020-01-03 16:44:19
1.什么是委托 2.委托概述 3.声明委托类型 4.创建委托对象 5.给委托赋值 6.组合委托 7.为委托添加/移除方法 8.调用委托 9.委托的示例 10.调用带返回值的委托 11.调用带引用参数的委托 12.匿名方法 12.1 使用匿名方法 12.2 匿名方法的语法 12.2.1 返回类型 12.2.2 参数 12.2.3 params参数 13.Lambda表达式 14.常见泛型委托 14.1 Action 14.2 Func 14.3 Predicate 1.什么是委托 可以认为委托是持有一个或多个方法的对象,此对象可以执行它所“持有”的方法。 delegate void Del(int value); class Program { static int a = 1; static void Up(int v) { Console.WriteLine($"{a + v}"); } static void Down(int v) { Console.WriteLine($"{a - v}"); } static void Main() { Del del1 = new Del(Up); Del del2 = new Del(Down); del1(1); del2(1); Console.ReadKey(); } output 2 0 2.委托概述 使用委托与类的比较

委托、匿名方法、Lambda表达式、泛型委托(自定义、Func、Action、Predicate)、约束泛型类和方法、多窗体传递消息、事件、异步编程、二次控件开发

放肆的年华 提交于 2020-01-02 07:13:31
1.匿名方法   没有具体名称,只有委托关键字、方法参数、方法体,所以称之为匿名方法   匿名方法允许将代码块(方法体部分)通过委托变量作为参数传递,以代替独立定义的方法 总结:   方法体要以delegate开头,其后是参数列表,后面紧跟花括号编写方法体,最后以分号结尾   匿名方法是将方法定义与委托变量两个步骤合在一起,省略了方法的单独定义   如果一个方法有一个委托类型的参数,可以直接将匿名方法作为实参。 1 //声明委托 2 public delegate int MyDelegate(int a, int b); 3 4 static void Main(string[] args) 5 {//匿名方法 6 MyDelegate objDel = delegate (int a, int b) 7 { 8 return a + b; 9 }; 10 Console.WriteLine(objDel(10, 20)); 11 Console.ReadLine(); 12 } 匿名方法 2.lambda表达式   C#3.0引入lambda表达式,lambda表达式是匿名方法更简介使用的一种方式   (参数列表) => {方法体} =>读作goes to   lambda表达式参数列表中的参数类型可以是“明确”类型或者是“推断类型”(可以省略参数类型)   如果是推断类型

c# 代理/委托 Delegate

醉酒当歌 提交于 2020-01-02 07:12:20
代码 1 . 委托的定义: 委托是函数的封装,它代表一 " 类 " 函数. 他们都符合一定的签名:拥有相同的参数列表,返回值类型.同时,委托也可以看成是对函数的抽象,是函数的 " 类 " .此时,委托的实例将代表一个具体的函数. 委托声明和定义了一个引用类型,它用来封装方法,用指定的签名来封装方法.一个委托的实例,可以封装静态或者实例方法. 委托是一种引用的类型,一旦为委托分配了方法,委托将与该方法完全相同的行为,委托方法的使用可以像其他任何方法一样, 具有参数和返回值 委托的一个特征是它们的类型是安全的.可以确保被调用的方法签名是正确的,但他们并不关心调用该方法的是什么类型的对象,甚至不考虑该方法是静态方法还是实例方法.(给定委托的实例可以表示任何类型的任何对象上的实例方法或静态方法,只要方法的签名匹配于委托的签名就可以). 2 . 委托的使用: 当要把方法传递给其他方法时,需要使用委托. 为什么什么用委托: 更加灵活的方法调用. 用于异步回调. 多线程编程中使用委托来定启动一个线程时调用的方法. C#中的事件模型,用他们来指明处理给定事件的方法. 例: class Program { // 定义委托 delegate double ProcessDelegate( double param1, double param2); static double Multiply(

c# 委托(Delegate)

牧云@^-^@ 提交于 2020-01-02 07:12:07
委托是c#中一个重要的概念。 一:委托 委托是和类一样的用户自定义类型。 二:委托的声明 既然委托也和类一样是一种类型,那么在它被用来创建变量之前该声明。 //声明一个普通的类 public class Student { } //声明一个委托类型 public delegate void Show(string hint); //声明一个方法 public void Show(string hint) { //some codes here. } 可以看到,声明一个委托类型和声明一个方法非常像。 格式: 1.用delegate关键字修饰 2.返回类型+委托类型名字+参数列表 三:实例化委托 //声明一个委托 public delegate void ShowMessage(string hint); //声明一个要被委托的方法,该方法的返回类型的,参数都和我们声明的委托一样 public void ShowName(string name) { MessageBox.Show(name); } //直接调用方法 //ShowName("233"); //实例化一个委托 在实例化一个委托的时候,需要给一个参数,这个参数就是要被执行的方法名字。 ShowMessage sm = new ShowMessage(ShowName); //执行委托 实际上就是帮忙调用一下方法sm(

C#委托(delegate)

天大地大妈咪最大 提交于 2020-01-02 07:11:32
  C#中委托(delegate)是一种安全地封装方法的类型,委托是面向对象的、类型安全的。   使用委托的步骤:   1、声明委托 public delegate void DelegateHandler(string message);   2、定义委托方法 // Create a method for a delegate. public static void DelegateMethod(string message) { Console.WriteLine(message); }   3、创建委托对象,并将需要传递的函数作为参数传入 // Instantiate the delegate. DelegateHandler handler = DelegateMethod;   或: // Instantiate the delegate. DelegateHandler handler = new DelegateHandler(DelegateMethod);   4、调用委托方法 // Call the delegate. handler("Hello World");   完整示例: using System; using System.Collections.Generic; using System.Text; namespace

C# Lambda表达式

只愿长相守 提交于 2019-12-29 23:40:42
今天高手讨论了一个问题: FuncList.FindAll(pNodes => pNodes.ParentID == "01") 等价于 if(pNodes.ParentID == "01") return pNodes; 实际就是一个委托函数的缩写。 总结一下: “Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”。 http://baike.baidu.com/view/3048187.htm Windbey中为了增强对集合的访问能力, MS设计了List<T>这么一个泛型集合, 其中有不少的增强功能,比如Foreach,ConvertAll,FindAll等等,并且为了方便使用MS在System名空间下引入了一些特制的Delegate.主要包括以下几个: 20 public delegate void Action<T>(T obj); //Used by ForEach 21 public delegate int Comparison<T>(T x, T y); /