1. 委托的声明
public delegate void NoReturnNoParam(); public delegate int WithReturnNoParam(); public delegate void NoReturnWithParam(string s, int i); public delegate int WithReturnWithParam(string s, int i); |
委托的声明: delegate [返回类型] 委托类型名 (参数1, 参数2)
委托是一种类型;
2. 委托的实例化
NoReturnNoParam method1 = new NoReturnNoParam(this.DoNothing); NoReturnNoParam method2 = new NoReturnNoParam(() => { Console.WriteLine("Do nothing"); }); NoReturnNoParam method3 = this.DoNothing; NoReturnNoParam method4 = () => { Console.WriteLine("Do nothing"); }; |
委托的实例化:
1. 通过new 构造一个委托实例,参数是:方法(名)或lambda表达式;
2. 直接给委托的变量赋值一个方法(名)或lambada表达式;
在给委托实例化的时候,一定要注意:用来实例化委托的方法的签名(返回值类型,参数类型和顺序都必须一致)必须和委托的声明是一致;
3. 委托的调用
method1.Invoke(); method1(); |
委托的调用:
1. 通过委托实例的Invoke方法调用;
2. 将委托当成方法一样,直接在实例名后加上括号和参数直接调用;
4. 匿名方法
WithReturnNoParam method5 = new WithReturnNoParam(delegate () { return 100; } ); WithReturnNoParam method6 = new WithReturnNoParam(delegate () { return 100; } ); |
5. lambda表达式
将匿名方法的delete去掉,在参数列表后加上”=>”(goes to)
WithReturnNoParam method7 = new WithReturnNoParam(() => { return 100; }); WithReturnNoParam method8 = () => { return 100; }; WithReturnNoParam method9 = () => 100; //方法体只有一行的时候,可以去掉大括号和分号,如果仅有的一行是return语句,还可以省略return关键字NoReturnWithParam method10 = (string name, int age) => { Console.WriteLine($"name:{name}, age:{age}"); }; NoReturnWithParam method11 = (name, age) => Console.WriteLine($"name:{name}, age:{age}"); //参数类型可以省略 |
6. 系统自带的委托
Action : 没有返回值的委托,参数最多16个
Func: 带返回值 的委托,参数最多16个;Func的泛型的最后一个可变类型参数是返回类型
Action act1 = () => Console.WriteLine("Do nothing"); Action<string> act2 = s=>Console.WriteLine(s); // 当只有一个参数的时候,括号可以省略Func<int> func1 = () => 100; Func<string, int> func2 = (s) => s.Length; |
7. 匿名类 var
object user = new { Name = "Harry", Age = 18, Height = 176.5, Address = "Peking City" }; //Console.WriteLine(user.Name); // 不可以访问user的属性 var user2 = new { Name = "Harry", Age = 18, Height = 176.5, Address = "Peking City" }; Console.WriteLine($"Name:{user2.Name}, Age:{user2.Age}, Height:{user2.Height}, Address:{user2.Address}"); |
var 关键字可以接收返回任意类型的结果或表达式的结果,前提类型可由编译器推导出;
var只能声明局部变量,不能是字段,也不能是静态属性;
var声明的时候必须被初始化;
8. 扩展方法
静态类,静态方法的第一个参数前加上this关键字,这个参数所在的类型将都会扩展此方法,可像成员方法一样去调用,如:
public static class ExtendShow { public static int ToInt(this int? i) { return i ?? -1; }} int? i = null; Console.WriteLine(i.ToInt()); |
在不修改第三方类库封装的情况下,给类型额外的扩展一个方法;
如果跟实例方法相同,则优先调用实例方法;