C♯ 2.0 的特性

来自站长百科
跳转至: 导航、​ 搜索

导航:上一页|C语言 | C++ | C♯ |JAVA | Perl | Pascal | Visual Basic

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

分部类[ ]

分部类将类型的实现分在多个文件中。 它允许切分非常大的类,并且如果类的一部分是自动生成的方面也很有用处。

file1.cs:
public partial class MyClass
{
    public void MyMethod1()
    {
        // implementation
    }
}
file2.cs:
public partial class MyClass
{
    public void MyMethod2()
    {
        // implementation
    }
}

泛型[ ]

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

静态类[ ]

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

迭代器[ ]

一种新形式的迭代器 它提供了函数式编程中的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;
    }
}

匿名方法[ ]

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

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.

相关条目[ ]

参考来源[ ]