一、分部类
1、定义
partial class A
{
string aa;
}
partial class A
{
void DoTest() {...}
}
其实就是
class A
{
string aa;
void DoTest() {...}
}
2、好处(1). 可以把一个类的定义分部到多个文件中,所以可以让多个人同时操作一个类(2). 把系统生成的代码和用户代码分开
3、注意点(1). 只能定义类、结构和接口(2). 所有的部分都必须加partial(3). 每个部分中的类都必须有相同的访问符(4). 如果一个为abstract或sealed,则所有的都是abstract或sealed(5). 任何一个继承某个类,所有的都从该类继承。(6). 各个部分可以实现不同接口,会实现所有定义的接口。(7). 任何部分中定义的方法和字段可以被其他的部分中使用。(8). 嵌套类型可以是分部的,它外面的类型是不是分部的是无所谓的。(9). 最后属性会进行合并(10). 只能放在class关键字前面(11). 必须在同一个程序集中。(12). 泛型的参数说明必须加到所有的后面,泛型参数必须一致。
二、迭代器1、定义 可以用foreach方法,在2.0中不需要去实现IEnumerable 和 IEnumerator接口,只需要写方法返回IEnumerable接口。用yield return 某个值就可以了。
具体如下public static IEnumerable power(int number , int exponent ){ int counter = 0; int result = 1; while( counter++ < exponent) { result = result * number; yield return result; //会保存当前位置,下次调用是会从该位置重新执行。 }}
这样就可以了。
2、注意点(1). 必须返回相同类型(2). 可用作方法、运算符和get访问器(3). yield break终止迭代(4). 可以用多个迭代器(5). 返回值必须是IEnumerable、IEnumerator、IEnumerable<T>、IEnumerator<T>接口。
三、可空类型1、定义 其实是System.Nullable<T>的实例,可以设置空值。 如Nullable<Int32>:可以赋任何正确的类型和null 定义时可以用:Nullable<int> num = null或者int? num=null 可以把日期设置为null2、注意点(1). 用??来取到默认值int? x = null;int y = x??-1;(2). 不允许使用嵌套的可空类型。Nullable<Nullable<int>>(3). 取到值用Value,或者用GetValueOrDefault();
四、匿名方法1、定义命名方法//public delegate void System.EventHandle(object sender , EventArgs e);this.load += new System.EventHandle(this.Form1_Load);
public void Form1_Load(object sender , EventArgs e){ ...}
//匿名方法this.load += delegate(object sender , EventArgs e){ ...};//分号不能少
2、注意点(1). 不能使用out和ref的参数(2). 不能用不安全代码
五、属性访问器可访问性1、public string Something { get{return something;} set{something=value;} }
2、现在可以限制其中一个的可访问性 public string Something { get{return something;} protected set{something=value;} }3、接口中的不能增加属性可访问性,所以可以在实现接口中的类进行添加。4、当属性有两个访问器的的时候,可以限制其中一个。5、属性访问器的可访问性必须比属性可访问性更严格6、override必须与被重写的那个属性相同。
六、委托中的协变与逆变1、协变,委托方法返回类型可以更具体public delegate 父类 SomeFucntion();public 子类 OtherFunction(){ ...}
2、逆变public delegate void SomeFucntion(子类);public void OtherFunction(父类){ ...}
七、命名空间别名限定符1、class System{}
global::System.Console.WriteLine("Hello world!");//global 表示全局的
2、using colAlias = System.Collections;//别名
colAlias::Hashtable test = new colAlias::Hashtable();//colAlias.Hashtable