C#语法细节知多少

这些天又仔细看了遍MSDN中的C#编程指南,有些细节的东西顺便就记下了:

C#:
结构可以实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。
从 enum 类型到整型的转换需要用显式类型转换来完成。
对同一成员同时使用 new 和 override 是错误的做法,因为这两个修饰符的含义互斥。new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。override 修饰符会扩展继承成员的实现。类是引用类型,而结构是值类型。引用类型在堆中分配,内存管理由垃圾回收器处理。值类型在堆栈上或以内联方式分配,且在超出范围时释放。通常,值类型的分配和释放开销更小。然而,如果在要求大量的装箱和取消装箱操作的情况下使用,则值类型的表现就不如引用类型。

任何情况下,抽象类都不应进行实例化,因此,正确定义其构造函数就非常重要。确保抽象类功能的正确性和扩展性也很重要。
不能用 C# 重写 internal virtual 方法

只有在通过派生类类型发生访问时,基类的受保护成员在派生类中才是可访问的,只有通过“派生类”才能访问!
私有成员只有在声明它们的类和结构体中才是可访问的

静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数


静态类的主要功能如下:

它们仅包含静态成员。

它们不能被实例化。

它们是密封的。

它们不能包含实例构造函数

 

静态成员:即使没有创建类的实例,也可以调用该类中的静态方法、字段、属性或事件。如果创建了该类的任何实例,不能使用实例来访问静态成员。
静态成员通常用于表示不会随对象状态而变化的数据或计算;例如,数学库可能包含用于计算正弦和余弦的静态方法。
静态方法可以被重载,但不能被重写。
不能在结构中定义析构函数。只能对类使用析构函数。

一个类只能有一个析构函数。
无法调用析构函数。它们是被自动调用的。

析构函数既没有修饰符,也没有参数。

readonly 关键字与 const 关键字不同。const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段为编译时常数,而 readonly 字段可用于运行时常数。

字符串对象是不可变的:即它们创建之后就无法更改
string s1 = "Hello";
string s2 = s1;
s1 += " and goodbye.";
Console.WriteLine(s2); //outputs "Hello"

在原义字符串中,用另一个双引号字符转义双引号字符,如以下示例所示:
string s = @"You say ""goodbye"" and I say ""hello""";

如果实例可以被公共访问,将出现 lock (this) 问题。

如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。


除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。


结构类型的构造函数与类的构造函数类似,但是 structs 不能包含显式默认构造函数,因为编译器将自动提供一个构造函数。此构造函数会将 struct 中的每个字段初始化为默认值。类和 structs 都可以定义具有参数的构造函数。带参数的构造函数必须通过 new 语句或 base 语句来调用。类和 structs 还可以定义多个构造函数,并且二者均不需要定义默认构造函数。
基类的构造函数在执行构造函数块之前被调用
从静态方法中使用 base 关键字是错误的。
不能在结构中定义析构函数。只能对类使用析构函数。
一个类只能有一个析构函数。

应用程序域使应用程序以及应用程序的数据彼此分离,有助于提高安全性。单个进程可以运行多个应用程序域,并具有在单独进程中所存在的隔离级别。在单个进程中运行多个应用程序提高了服务器伸缩性。
必须先将程序集加载到应用程序域中,然后才能执行该程序集。有关更多信息,请参见程序集和全局程序集缓存(C# 编程指南)。

一个应用程序域中的错误不会影响在另一个应用程序域中运行的其他代码。

能够在不停止整个进程的情况下停止单个应用程序并卸载代码。不能卸载单独的程序集或类型,只能卸载整个应用程序域。

 

posted @ 2009-03-18 10:46  chunchill  阅读(233)  评论(0编辑  收藏  举报