C#2.0学习笔记(二) 语言和编译器新增功能介绍

1)分部类(Partial Classes)

C#2.0可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可。
在处理大型项目时使一个类分布于多个独立文件中可以让多位程序员对该类进行处理。
使用自动生成的源时无需重新创建源文件便可以将代码添加到类中。Visual Studio在创建Windows窗体、Web窗体时都使用此方法。无需编辑VisualStudio所创建的文件便可创建使用这些类的代码。
使用partial关键字表明可在命名空间内定义该类、结构或接口的其它部分。其它的诸如枚举之类的不能使用该关键字。
所有部分都必须使用该关键字。各个部分必须具有相同的可访问性。如public和private等。如果将任意部分声明为抽象的或密封的,整个类型都被视为抽象的或密封的。如果将任意部分声明为基类型,则整个类型都将继承该类。
指定基类的所有部分必须一致。但忽略基类的部分仍继承该类型。
各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。
在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。
嵌套类型可以是分部的,即使它们所嵌套于的类型本身并不是分部的也如此。如
class Container
{
   partial class Nested
   {
      void Test(){}
   }
   partial class Nested
   {
       void Test2(){}
   }
}

编译时将对分部类型定义的属性进行合并。

限制:
1)要作为同一类型的各个部分的所有分部类型定义都必须使用partial进行修饰。
2)partial修饰符只能出现在紧靠关键字class、struct或interface前面的位置。
3)要成为同一类型的各个部分的所有分部类型定义都必须在同一程序集和同一模块(EXE或DLL)中进行定义。分部定义不能跨越多个模块。
4)类名和泛型类型参数在所有的分部类型定义中必须匹配。泛型类型可以是分部的,每个分部声明都必须以相同的顺序使用相同的参数名。

 


2)迭代器(Iterators)

迭代器是方法、get访问器或运算符,它使你能够在类或结构中支持foreach迭代,而不必实现整个IEnumerable接口。如:
public class YieldTest
{
   public static IEnumerable Power(int number,int exponent)
   {
      int counter=0;
      int result =1;
      while (counter++<exponent)
      {
         result = result *number;
         yield return result;//yield关键字用于指定返回的值,到达yield return语句时,会保存当前位置,下次调用迭代器时会从此位置重新开始执行。

      }

   }
}

迭代器是可以返回相同类型的值的有序序列的一段代码。迭代器可用作方法、运算符或get访问器的代码体。迭代器代码使用yield return语句依次返回每个元素。yield break将终止迭代。可以在类中实现多个迭代器,每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在foreach语句中被客户端代码调用。迭代器的返回类型必须为IEnumerable、Ienumerator、IEnumerable<T>或IEnumerator<T>。


3)可空类型(Nullable Types)

可空类型是System.Nullable<T>结构的实例。可以表示其基础类型正常范围内的值再加上一个null值。例如Nullable<int32>读作“可空的Int32”,可以被赋值为-2147483648到2147483647之间的任意值,也可以被赋值为null值。Nullable<bool>可以被赋值为true或false,或null。如:Nullable<int>num = null相当于int? num=null;
在处理数据库和其它包含可能未赋值的元素的数据类型时,将null赋值给数值类型或bol型的功能特别有用。例如,数据库中的布尔型字段可以存储值True或False,或者该字段也可以未定义。数据库中日期类型可以为null,现在C#日期也可以为null。

bool? b = null;
DateTime? d = null;

使用??运算符分配默认值,当前值为空的可空类型被赋值给非空类型时将应用该默认值。如:int? x = null;int y = x ?? -1 //如果X没有值,使用默认值,不会出错了

不允许使用嵌套的可空类型如:Nullable<Nullable<int>> n

 


4)匿名方法(Anonymous Methods)

在2.0之前的C#版本中,声明委托的唯一方法是使用命名方法。要将代码块传递为委托参数,创建匿名方法是唯一方法:
This.load += delegate(System.Object o,System.EventArgs e){MessageBox.Show("...");};

如果使用匿名方法,则不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。比如启动新线程可以用以下代码:
void StartThread()
{
    System.Threading.Thrad t1=new System.Threading.Thread( delegate()
    {
        System.Console.Write("Hello,");
        System.Console.WriteLine("World!");
    {);
    t1.Start();
}

如果局部变量和参数的范围包含匿名方法声明,则该局部变量和参数称为该匿名方法的外部变量或捕获变量。例如,下面代码段中的n即是一个外部变量:
int n=0;
Del d = delegate(){System.Console.WriteLine("Copy #:{0}",++n);};

与局部变量不同,外部变量的生命周期一直持续到引用该匿名方法的委托符合垃圾回收条件为止。对n的引用是在创建该委托时捕获的。匿名方法不能访问外部范围的ref或out参数,不能访问任何不安全代码。

 

5)属性访问器可访问性(Property Accessor Assessibility)

属性或索引器的get和set部分称为访问器,默认情况下这些访问器具有相同的可见性或访问级别。其所属属性或索引器的可见性或访问级别。有时限制对其中某个访问器的访问会很有用。通常是在保持get访问器可公开访问的情况下,限制set访问器的可访问性。

不能对接口或显式接口成员实现使用访问器修饰符。使用访问器实现接口时,访问器不能具有访问修饰符,但如果使用一个访问器(如get)实现接口,则另一个访问器可以具有访问修饰符。

仅当属性或索引器同时具有set和get访问器时才能使用访问器修饰符。这种情况下只允许对其中一个访问器使用修饰符。
访问器的可访问性级别必须比属性或索引器本身的可访问性级别具有更严格的控制。
如果属性或索引器具有override修饰符,则访问器修饰符必须与重写的访问器的访问器(如果有的话)匹配。

 

6)委托中的协变与逆变(Covariance and Contravariance in Delegates)

当委托方法的返回类型具有的派生程序比委托签名更大时,就称为委托方法。因为方法的返回类型比委托签名的返回类型更具体,所以可以对其进行隐匿转换。这样该方法就可用为委托。协变使得创建可被类和派生类同时使用的委托方法成为可能。

当委托方法签名具有一个或多个参数,并且这些参数的类型派生自方法参数的类型时就称为逆变委托方法。因为委托方法签名参数比方法参数更具体,因此可以在传递给处理程序方法时对它们进行隐式转换。这样逆变使得可由大量类使用的更通用的委托方法的创建变得更加简单。

 

7) 命名空间别名限定符(Namespace alias qualifier)

当成员可能被同名的其它实体隐藏时能够访问全局命名空间中的成员非常有用。别名限定符是双冒号::。命名空间别名限定符可以是global。这将调用全局命名空间的查找而不是在别名命名空间中。
如:

class System{}

global::System.Console.WriteLine("HelloWorld"); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值