C# 2.0 的特性 总结

针对于.NET SDK 2.0(相对应于ECMA-334 标准第三版),C# 的新特性有:

 分部类分部类将类型的实现分在多个文件中

file1.cs:

public partial class MyClass1
{
    public void MyMethod1()
    {
        // implementation
    }
}
file2.cs:

public partial class MyClass1
{
    public void MyMethod2()
    {
        // implementation
    }
}
分部类这个特性允许将一个类的编写工作分配给多个人,一人写一个文件,便于版本控制。它又可以隔离自动生成的代码和人工书写的代码,例如设计窗体应用程序时。

 泛型

或参数化类型,是被C#支持的.NET 2.0特性。不同于C++模版,.NET 参数化类型是在运行时被实例化,而不是编译时,因此它可以跨语言,而C++模版却不行。它支持的一些特性并不被C++模版直接支持,比如约束泛型参数实现一个接口。另一方面,C# 不支持无类型的泛型参数。不像Java中的泛型,在CLI虚拟机中,.NET generics 使用 具化 生成泛型参数,它允许优化和保存类型信息。[1]

 静态类

静态类它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。

 迭代器

一种新形式的迭代器 它提供了函数式编程中的generator,使用yield return

类似于Python中使用的yield

// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
    foreach (int i in numbers)
    {
        if (i % 2 == 0) yield return i;
    }
}

 匿名方法

匿名方法类似于函数式编程中的闭包。[2]

public void Foo(object parameter)
{
    // ...
 
    ThreadPool.QueueUserWorkItem(delegate
    {
        // anonymous delegates have full access to local variables of the enclosing method
        if (parameter == ...)
        {
            // ...
        }
 
        // ...
    });
}


委托的协变和逆变委托签名的协变和逆变

属性访问器可以被单独设置访问级别例子:

string status = string.Empty;
 
public string Status
{
    get { return status; }             // anyone can get value of this property,
    protected set { status = value; }  // but only derived classes can change it
}


可空类型可空类型 (跟个问号, 如 int? i = null;) 允许设置 null 给任何类类型。

int? i = null;
object o = i;
if (o == null)
    Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");
else
    Console.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");


 ??操作符(??) 用于如果类不为空值时返回它自身,如果为空值则返回之后的操作

object nullObj = null;
object obj = new Object();
return nullObj ?? obj; // returns obj
主要用作将一个可空类型赋值给不可空类型的简便语法

int? i = null;
int j = i ?? 0; // Unless i is null, initialize j to i. Else (if i is null), initialize j to 0.

很多.net程序员对某些概念不是很了解,这里做简单说明 欢迎补充!

posted @ 2011-07-29 10:44  JavAndroidJSql  阅读(993)  评论(0编辑  收藏  举报