类和对象

类是数据类型的实现,而对象是类的实例。

类的成员是声明在类里面的实体。C#类的成员共有六种:字段、属性、索引器、方法、事件和嵌套类型。

C#的字段用const修饰,表示他只能在声明的时候被初始化;用readonly修饰,表示只能在声明时或构造函数中初始化。两种情况下字段的值在初始化之后都不能再改变。
在对象开始使用之前,所有值类型的字段都必须初始化,即必须在对象构造结束之前被初始化。有两种方法初始化:
  1. 在类中声明时直接初始化;
  2. 在类的构造函数中初始化。

const字段必须在声明时被初始化,否则编译器会报错。而且const隐含static。
readonly字段应在构造函数结束之前被初始化,否则该字段将永远保持为null,但编译器不会报错。

在方法声明和调用时,同时使用ref关键字,C#可以使得方法强制按引用传递参数。既能用在值类型也能用在引用类型上。
参数在方法的签名中以及方法调用时都用out关键字来标记,则可以使得该参数作为方法的返回值,即其值可以返回。此外,实参不需要初始化。方法必须要初始化这些形参,否则不能使用它们。
C#允许方法带有不定数目的参数。实现该特性的语法是使用params关键字。应用params关键字的参数必须是参数表中最后一个参数。
使用params关键字的参数可以应用于object类型,通过这个技巧该参数就可以接受各种类型。

方法重载:一个类的多个方法使用相同的名称。
其方法参数表必须各不相同。编译器区分不同方法时并不考虑返回值的类型。

C#允许对象提供事件,事件的概念包括以下几点:
    事件的订阅者,当事件引发时每个订阅者都会收到通知。订阅者可以动态地(即在程序运行时)选择订阅或退订事件。在C#中,订阅者表示为一个方法。
    事件本身,可以在任何时候可以由对象引发。从内部来说,事件知道它的订阅者。事件的职责就是在其引发的时候用事件的参数通知每一个订阅者。在C#中,除了使用event关键字声明的以外,事件类似于类中一个委托类型的字段。
使用event关键字(定义事件)的好处之一就是防止事件在类的外部引发。即使是定义事件的类所派生的子类也不能触发事件,即使这个事件是虚的也不能。
当一个事件被引发时,订阅事件的方法会在引发该事件的线程中执行。
订阅者的执行时间可能会很长或引发异常,这说明,激发事件的方法不应该与订阅事件的方法耦合。可以让订阅的方法异步执行。

内部可见性级别以及内部或保护可见性级别不能应用于结构体成员。
因为一个类A的私有成员只能在它的内部访问,这意味着类A的实例I1能够访问同一个类的另一个实例I2的私有成员。有点困惑,可以查看这里

在类中,只要定义了至少一个构造函数,编译器就不会提供默认构造函数。
而在结构中,因为不允许定义没有参数的构造函数,所以编译器始终会提供一个默认的构造函数。

C#语言提供了一个使用using关键字的语法可以隐式地在一个try/finally块中自动调用Dispose()方法。即:

Article a = new Article(300);
try
{
}

finally
{
    a.Dispose();
}

等价于

Article a = new Article(300);
using(a) 
{
}

对于using(a) using(b) {},在有效区域末尾调用Dispose()方法的顺序是先调用b.Dispose(),然后才是a.Dispose()。
当一个类实现了IDisposable接口,推荐在调用Dispose()之后,通过引发System.ObjectDisposedException异常来阻止对象的其他方法调用。为了留给用户较多的余地,还推荐允许多次调用一个对象的Dispose()。当然,只有第一次调用才起作用。

终结器是通过覆写Object类的Finalize()方法来定义的。结构没有终结器。CLR认为没有重写该方法的类就没有终结器。
终结器是在对象被垃圾收集器收集时调用的。对象状态所占的内存将在下一次垃圾收集时释放。

静态方法无法访问类的非静态方法、字段、属性和事件。
静态构造函数,有时也称为类构造函数,其声明的方法是在前面加上static关键字,并且不能带参数。而且不能带有可见性修饰符。
C#2.0运行定义静态类。静态类只能包含静态成员。C#编译器不为静态类提供默认构造函数。由于不具有实例构造函数,所以无法实例化静态类。而且不能继承一个静态类。结构不能是静态的。ee6d64b9

posted @ 2008-07-14 18:18  随风逝去(叶进)  阅读(947)  评论(1编辑  收藏  举报
Free Web Counter
Free Web Counter