当用常规的委托调用方法时使代码很混乱或者不简洁的时候,可以使用匿名方法(内联代码块定义)。什么意思呢,我们用委托调用方法时,是根据方法名调用的,当需要待用的方法很多时,我们创建很多的方法,但是很多方法又不常用,现在我们可以用匿名方法代替。
匿名方法允许我们定义委托对象可以接受的代码块。这个功能省去我们创建委托时想要传递给一个委托的小型代码块的一个额外的步骤。它也消除了类代码中小型方法的混乱。
匿名方法总是以一个delegate关键字开始,后面跟着用在方法和方法体(the method body)本身中的参数。
匿名函数(Anonymous Function)是表示“内联”方法定义的表达式。匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型。匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托;如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树。(匿名函数可以理解我只使用一次的委托)
匿名函数有两种语法风格:Lambda表达式(lambda-expression)和匿名方法表达式(anonymous-method-expression)。在几乎所有的情况下,Lambda表达式都比匿名方法表达式更为简介具有表现力。但现在C#语言中仍保留了后者,为了向后兼容。
Lambda表达式:
async可选 (匿名的函数签名)=> (匿名的函数体)
匿名方法表达式:
async可选 delegate (显式的匿名函数签名) 可选{代码块}
当多态想扩展某个类型的功能,却不想创建子类的时候(或不能,比如密封),这个特殊语言特性(扩展方法)会有用。
匿名类型:当需要定义来封装一些相关数据,但不需要任何关联的方法、事件和其他自定义的功能。使用关键字var来new直接创建类定义。(开销小)
(例子: //建立整形列表
List<int> list = new List<int>();
list.AddRange(new int[] { 11, 4, 5, 14, 22, 33 });
//使用匿名方法
List<int> even = list.FindAll(delegate (int i) { return (i % 2) == 0; });
//使用lambda表达式()更为简洁
List<int> even2 = list.FindAll(i=> (i % 2) == 0);
)