1.所有的类和结构体中都有Equals方法用于类和结构体之间是否相等的判断,该方法在System.Object类中定义。ValueType类中重写了这个方法,因此对于所有的结构体,只要是同一个结构体的实例,并且所有的域相等,那么这两个实例便相等,用Equals方法的结果是True。对于类,使用‘==’运算符的结果跟作用Equals方法的结果一致。类默认的Equals方法比较的是其引用值。结构体之间默认不能使用‘==’和‘!=’运算符,如果你想要用这两个运算符进行结构体间的比较就必须自己在结构体中定义这两个运算符的用法。

 

2.相同结构体的实例之间使用‘=’,效果跟C++中的int等基本数据类型效果一致,即将整个实例的值复制给另一个实例。而类的实例之间用‘=’则类似于C++中的指针赋值,即将实例的引用复制给另一个实例,结果这两个实例将指向同一个数据。

 

3.constant定义的常量必须在声明时初始化,并且跟实例无关。而readonly定义的常量可以在声明时初始化,也可以在构造函数中初始化。

 

4.C#中可以用属性来代替传统的setget方法,其形式如:public int Year { set { if (value < 1) throw new ArgumentOutOfRangeException("Year"); year = value; } get { return year; } } 。如果没有set而只有get关键字,那么这个属性是只读的。setget并非是C#的关键字,你可以用它们做变量名,只有在属性定义时它们才会具有特殊含义。set块中value代指赋给属性的值,get块中必须有return返回一个值。

 

5.属性并不属于CLS或者中间语言,C#在编译时会把它翻译成相应的getset方法,比如Year属性,它会将其翻译为set_Yearget_Year两个方法,因此你不能再定义名字与此相同的方法,否则会出现重定义错误。

 

6.对于大部分.Net编程者而言,他们习惯将不是静态的域定义为private,而将其对应的属性设置为public,属性通常以大写字母开头,非静态域以小写字母或下划线开头。

 

7.如果一个方法能够被改写成属性,尽量写成属性的形式。

 

8.c#只支持单继承,即与C++不同,一个类只能继承单独一个类。C#只有一种继承方式,该方式与C++public方式相仿。

 

9.要调用基类构造函数,其形式如下:class ExtendedDate: Date { public ExtendedDate() { } public ExtendedDate(int year, int month, int day) : base(year, month, day) { } }。其中‘base’关键字即代表基类构造函数名。通常在构造函数名后加上‘this’或‘base’调用其它该类或父类的构造函数,将其称之为构造函数初始器。在执行构造函数前会先执行冒号后面的构造函数。如果你自己没有指定构造函数初始器,那么C#会自动帮你加上base(),即调用父类的无参构造函数作为构造函数初始器。

posted on 2013-02-10 12:31  RedHood  阅读(237)  评论(0编辑  收藏  举报