1)关于Assembly
1 就是一堆相关类的打一个包,这样程序中若用到其他功能,那就只引用该功能所在的程序集即可,减小了尺寸;同时一些程序集内部的类不想让其他程序集调用。
2 如果所调用的类在没有引用的程序集中,那么需要添加对所在类的程序集的引用。
3 Assembly的访问级别,类如果不标注访问级别就是internal;即只能在程序集内部访问;如果想让别的程序集访问,就需要public。
4 可以自己编写Assembly:新建类库,生成后就是一个dll,然后在别的项目中添加引用该dll即可,使用该dll类库中的定义的非internal类了。
5 托管代码:可以反编译出来的,最终编译生成MSIL。非托管代码:编译生成机器码。
6 GAC(全局程序集):
2)关于访问级别
1 子类的访问级别不能比父类的访问级别高。很明显,因为子类可以使用父类的成员。
2 public>internal>privare;
3 一个程序集内部可以访问的方法不能返回一个internal类对象;
3)关于委托(用于指向函数,限制了改函数的返回值类型和参数类型)
1 其作用就是:希望能够调用一个函数,但是写程序的时候不知道调用的是哪个函数,只要能传递参数,取出返回值就可以。 就好比是,多态的实现,只知道实现了改类的子类一定会有该方法,但是如何实现该方法,却是不知道的是哪个对象。
2 委托是一种类型,所以和class同级: 声明一个委托
delegate 类型 someDelegate(参数); //声明一个委托类型someDelegate;
使用委托: someDelegate sd1=函数名; //定义了委托变量记住是委托指向了函数,并不是为委托调用函数。sd1=some1;sd1=some2;一个委托变量可以指向多个函数;
使用委托: sd1(参数); //这样此时才是真正的指向委托变量指向的函数。
3 总结:使用委托来约束函数类型,然后使用委托变量来使用被约束的函数。
4 使用案例:对集合数组进行过滤掉其中的奇数或者负数。 //思路:可以定义一个委托,该委托的参数是一个Int数,返回值时bool;至于如何对int数操作,不同的函数去实现不同的功能。这样要使用该委托时,就将此委托作为参数,然后将指向了功能函数的委托变量传递过去即可。
5 所以,委托是多个函数的父类,也实现了多态。
4)关于事件:就是将委托类型作为一个class的字段使用;然后再该类的对象中,为该对象的委托字段,赋值,让其指向函数。
1 可以将一个委托变量指向多个函数,即将多个委托串联起来,即用一个委托变量加减多个委托。
someDelegate s1=new someDelegate()+new someDelegate();
2 用加减可以使委托实现多个功能同时进行,也即多个人同时监听。
3 但是将委托声明为类的public字段时,会发生消灭监听行为(Null)和假冒事件行为(执行)。
所以可将其声明为私有字段,然后提供一个add方法,只提供一个入口--就是参事就是委托类型,然后在函数内,将委托类型添加到私有字段中即可。
public void AddSQ(SQDelegate d){onSQ+=d;}
简便写法: public event SQDelegate onSQ { add{} remove{} };
所以事件的标准写法:event 委托类型 事件名{ add remove}
4 委托和事件的关系:事件就是让外界只能+=;-=;不能所以触发或者消灭委托。
5)避免命名重复的问题,可以使用委托变量指向一个匿名方法
//匿名方法: 对象名.事件名+=delegate(参数类型 参数名){方法体; } ;调用:f(参数值);
//lamda表达式: (参数名)=>{方法体} ; 调用: 委托变量(参数值);
6)关于lamda表达式
1 如果lamda表达式中匿名函数的方法体如果只有一句话,并且是返回值,那么可以省略方法体的{},以及return,就把=>后的表达式作为返回值。 FilterDelegate fd = (d) => d == "d";
2 知数组itme;求它大于零的数:item.Where(i=> i>0) ;可知 where中的条件是一个委托指向一个函数,该函数参数是int,返回值是bool; static bool IsOK(int i){return i>0}; //即用lamda表达式实现匿名委托;
3 已知数组item,进行升序排序:item.OrderBy(i=> i); 降序排序:item.OrderBy(i=> -i);
4 已知数组item,求出乘以2后的结果; item.Select(i=>i*2); 5 所以,总结--orderBy排序;select计算;where过滤

浙公网安备 33010602011771号