泛型委托深入
1) 隐式类型Var的使用
static void Main(string[] args) { //隐式类型 var person = new {name ="小明",age="12"}; //不需要定义类的名称 Console.WriteLine(person.name); //如果使用object,访问不了匿名类的属性name和age,如果想访问的到,可以使用反射! Console.ReadKey(); }
2)匿名函数和lambda表达式的使用
internal delegate int DemoAdd(int a, int b); class Program { static void Main(string[] args) { //匿名函数的关键字就是delegate开头的,(类似于javascript的function),后面紧接着函数的参数,后面是函数体 DemoAdd demoAdd = delegate(int a, int b) { return a + b; }; //以上用Lambda表示式,=>表示成goto DemoAdd lamdaDemoAdd = ( a, b) => { return a + b; }; DemoAdd lamdaDemoAdd1 = ( a, b) => a + b; Console.ReadKey(); } }
3)泛型委托
internal delegate int DemoAdd(int a, int b); //定义泛型返回值 delegate T DemoAdd<T>(int a ,int b); //参数也定义泛型 delegate T DemoAdd1<T,T1,T2>(T1 a, T2 b); class Program { static void Main(string[] args) { //泛型返回值 DemoAdd<string> demoAdd = (a, b) => (a + b).ToString(); //参数类型为String,返回类型是字符串 DemoAdd1<string,string,string > demoAdd1 = (a, b) => (a + b).ToString(); //参数类型为int,返回类型也是整型 DemoAdd1<int, int, int> demoAdd2 = (a, b) => a + b; } }
4)Func<T, TResult> 委托 ,可以使用此委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有一个通过值传递给它的参数,并且必须返回值。
//Func与Action的区别:Action是没有返回值,Func有返回值 internal delegate TResult Func<in T, out TResult>( T args ); class Program { static void Main(string[] args) { //所用的方法是实例化 Func<T, TResult> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。 //传入参数是字符串,返回值也是字符串 Func<string, string> convertMethod = UppercaseString; string name = "Dakota"; Console.WriteLine(convertMethod(name)); } private static string UppercaseString(string inputString) { return inputString.ToUpper(); } }