委托:是一种引用类型,表示具有特定参数列表和返回类型 的方法引用,可以将其实例与任何具有兼容签名和返回类型的方法相关联,可以通过委托实例调用方法
委托声明:public delegate 返回类型 委托名 参数列表; //delegate声明委托的关键字
委托实例化:委托是一种特殊的类,需要使用new实例化委托,可以指向一个具有相同标签的方法
语法: 委托名 定义一个委托对象名=new 委托名(被委的托方法); //使用委托将方法作为参数传递 eg: public delegate string TranslationDelegate (string s); TranslationDelegate transform=new TranslationDelegate(被委的托方法); 简写版:TranslationDelegate transform=被委的托方法;
调用委托:委托对象 invoke();
注:指向的方法需要符合委托所定义的方法签名和返回类型
多播委托:通过使用“+”运算符将多个对象分配到一个委托实例上,包含已分配的委托列表,因此多播委托被调用时会依次调用列表中的委托,仅可合并类型相同的委托,使用“-”运算符可以从多播委托中删除组件委托
隐式类型与匿名类型:声明的变量可以使用隐式类型,将普通变量声明中的数据类型名称替换为var
语法:var 变量=初始值 注:变量必须初始化,声明变量推断出类型后,变量的类型不能改改变
匿名类型:可用来将 一组只读属性封装到单个对象中,无需显示定义一个类型,类型名由编译器生成,不能在源代码级使用,每个属性类型由编译器推断,可通过使用new运算符和对象初始值创建匿名类型
匿名类:其本质和普通定义的类一样,只不过是由系统的编译器完成命名的 注:属性类型和顺序一致可以共同使用一个匿名类
匿名方法 :委托是用于引用与其具有相同标签的方法,可以使用委托对象调用可由委托引用的方法,匿名方法没有名称只有主体,代码块作为委托参数的技术,不需要指定返回类型(得从方法主体内的return推测) 注: 匿名方法不声明返回值类型,但方法返回值类型和委托返回值类型一致 在参数方面:参数数量、类型和修饰符必须和委托一样
C#扩展方法:使编码人员能够向现有类型添加方法,无需创建新的派生类型,重新编译或以其他方式修改原始类型
C#扩展方法介绍:是一种特殊的静态方法,允许使用实例方法的调用来调用静态方法,至少有一个参数,第一个参数指定该方法作用于哪种类型,且该参数以this修饰符作为前缀,不能破坏面向对象封装概念,只能访问所扩展的public成员。 注: 定义C#扩展方法是静态类 ,扩展方法是静态方法,第一个参数前加上this 代码中调用添加using指令(用于指定包含的扩展方法的类和命名空间)
yield:向编译器指示该关键字所在的方法是迭代器块,编译器将生成一个类来实现迭代器块中所表示的行为,yield关键字与return关键字结合使用表示向枚举器对象提供返回值,yield关键字与break结合使用表示迭代结束 注: 如果yield关键出现的方法、运算符或get访问器则是迭代器,可以实现自定义集合类型IEnumerator<T>和IEnumerable模式时无需使用其他显示类型
yield关键字的使用:使用foreach循环语句对List<T>集合进行循环遍历,将符合条件的数据返回 Eg:
public class Goods{
//封装字段
public string GoodsName{get;set;}//商品名称
public double GoodsPrice{get;set;} //商品价格
}
public static IEnumerable<Goods> getList(List<Goods>list,double price){
foreach(var item in list){
if(item.GoodsPrice==price){
yield return item;
}
}
}
static void Main(string[] args){
List<Goods> goodsInfoList=new List<Goods>(){
new Goods(){ GoodsName="薯条",GoodsPrice=6 },
new Goods(){ GoodsName="可乐",GoodsPrice=4 },
new Goods(){ GoodsName="汉堡",GoodsPrice=23 }
};
var obj=getList(goodsInfoList,4)//调用扩展方法getList,筛选出GoodsPrice=4
foreach (var item in obj){
Console.WriteLine("商品名称:{0},商品价格{1}",item.GoodsName,item.GoodsPrice);
}
}
Lambda表达式:是一个匿名方法,可以表示闭包,结合Linq(语言集成查询)完成相关的查询工作
Lambda表达式语法:形参列表=>方法体 注:形参列表(即参数),参数个数可以是0个、一个、多个等 函数体多于一条语句用大括号括起来
采用传统方式:
public delegate void DelegateFun(string str);
public class Lambda{
public void DelFun(string str){
Console.WriteLine("你好:"+str);
}
public void GetSay(){
DelegateFun myDelegate=new DelegateFun(DelFun);
myDelegate("李四");
}
}
static void Main(string[] args){
Lambda lam=new Lambda();
lam.GetSay();
Console.ReadLine();
}
采用匿名方法:
public delegate void DelegateFun(string str);
public class Lambda{
public void GetSay(){
DelegateFun myDelegate=new DelegateFun((x)=>{
Console.WriteLine("你好:"+x);
});
myDelegate("李四");
}
}
static void Main(stirng[] args){
Lambda lam=new Lambda();
lam.GetSay();
Console.ReadLine();
}
采用匿名方法、泛型委托和Lambda表达式:
public class Lambda{
public void GetSay(){
new Action<string>((x)=>{
Console.WriteLine("你好:"+x);
})("李四");
}
}
static void Main(string[] args){
Lambda lam=new Lambda();
lam.GetSay();
Console.ReadLine(;
}
注:泛型委托包含 Action(不带返回参数)、Func(带返回参数)和Predicate(返回bool类型) 此三种委托是mscorlib.dll程序集中定义好的 .net内置服务基本格式 https://www.cnblogs.com/maitian-lf/p/3671782.html