c#2.0的新功能(三):分部类、匿名方法等

    技术2022-05-11  78

    一、分部类

    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 


    最新回复(0)