属性访问器保护级别的变化
C# 2.0 允许我们对一个属性的get和set访问器使用不同的访问级别修饰符:
class Customer
{
private string name;
...
public string Name
{
get{return this.name;}
internal set(this.name=value;}
}
...
}
一些注意点
属性访问器(get或set)上应用的访问修饰符必须“小于”属性上应用的访问修饰符;“小于”的意思即“更严格”,例如protected小于public。
只能在一个属性访问器(get或set)上指定比属性上的访问修饰符“更小”的访问修饰符。
对于接口中属性的声明,不能给属性访问器(get或set)指定任何访问修饰符,只能默认为public。
属性访问器保护级别的变化规则完全适用于C#的索引器。
---------------------------------------------
名称空间别名限定符的引入
C# 2.0 允许我们使命名空间别名限定符(::)来避免不同命名空间中类型名称冲突的问题:
using SC = System.Collections;
using ZC = Zhucheng.Collections;
class Program
{
static void main()
{
ZC::ArrayList list = new ZC::ArrayList();
...
}
}
一些注意点
当使用命名空间别名限定符(::)时,如果ZC:ArrayList,编译器可以确保这是一个只适用于“名称空间别名”的限制符,不会辨析为其他类型、或者成员限定符(.)。
关键字global可以放在命名空间别名限定符(::)的左边,它使得编译器只去搜索那些所有的命名空间,而不会去搜索其他的类型、或成员。
尽可能地使用命名空间别名限定符(::),而减少使用点号(.)这样的通配限定符。
---------------------------------------------
pragma指示符的引入
C# 2.0 允许我们使用命名空间别名限定符(::)来避免不同命名空间中类型名称冲突的问题:
class program
{
[Obsolete]
static void Foo(){...}
static void Main()
{
#pragma warning disable 612
Foo();
#pragma warning restore 612
}
}
几个注意点
目前pragma指示符只支持#pragma warning
#pragma warning disable 可以禁止掉任何编译器警告信息。
#pragma warning restore 可以恢复被disable掉的任何编译器警告信息。
可以在disable和restore后面跟上具体的警告代码号,从而来禁止或者恢复特定的警告信息。
#prama是一个编译预处理功能,不影响任何代码运行机制。
---------------------------------------------
Conditional特性类的引入
C# 2.0 允许我们使用Conditional特性类来告诉编译器根据“特定的预定义指示符条件”来在类上应用特性。
#define DEBUG
using System;
using System.Diagnostics;
[Conditional("DEBUG")]
public class TestAttribute : Attribute{}
[Test]
class MyClass{}
几个注意点
如果定义了条件指示符,如#define DEBUG,那么编译器将在MyClass类上应用TestAttribute特性。
如果没有定义条件指示符,如#undef DEBUG,MyClass类照样可以正常使用,但是其上将不在应用TestAttribute特性。
注意区别C# 2.0 中的Conditional特性类和C# 1.0中的Conditional特性方法。
定长buffer的引入
C# 2.0 引入定长来使得我们可以在结构里声明C风格的数组,从而更加方便地实现托管代码和非托管代码的互操作:
unsafe struct MyClass
{
public fixed int x[5];
public fixed int y[10];
public fixed int z[100];
}
几个注意点
定长buffer只能使用在unsafe代码的上下文中,不可以在非unsafe的代码中使用。
使用定长buffer所定义的字段在结构类型的实例对象中将按照它们的声明顺序来进行内存布局。
注意区别unsafe代码中的定长buffer和我们通常使用的托管数组。
定长buffer主要应用在托管代码和非托管代码互操作的情况,除此之外,我们一般使用托管数组。
---------------------------------------------
C# 3.0 与未来发展
C# 2.0 的核心机制在于泛行编程的引入,它赋予了类型参数式多态的能力,将对今后的C#代码构造有重要影响。
研发中的C# 3.0 将XML、SQL两中数据处理技术引入到C#这样的强类型语言中,极大地丰富了C#语言的数据处理能力,是一个极具远见的创新。
C#语言的发展越来越多体现融合“设计模式+库”的思想,“语言的发展就是库的发展”。