2007-9-4
引用,该类型的变量不直接存储所包含的值,而是指向它所要存储的值。
C#
的引用类型有四种:类、代表、数组、接口。
一下代码表示类
B
从类
A
中继承:
Class A{}
Class B:A{}
类的成员有以下类型:
成员常量,代表与类相关联的常量值。
域,即类中的变量。
成员方法,复杂执行类中的计算和其它操作。
属性,用于定义类中的值,并对他们进行读写。
事件,用于说明发生了什么事情。
索引指示器,允许向使用数组那样为类添加路径列表。
操作符,定义类中特有的操作。
构造函数和析构函数,分别用于对例的实例进行初始化和销毁。
Internal修饰符的类的成员对于同一包中的应用程序或库是透明的,而在包.NET之外是禁止访问的。
包?
sealed?
类的实例——对象
保留字this仅限于在构造函数、类的方法和类的实例中使用。
静态成员是属于类所有的,非静态成员则属于类的实例。
任何构造函数的执行都隐式地调用了系统提供默认的构造函数base()。
C#实现了完全意义上的面向对象:任何事物都必须封装在类中,或者作为类的实例成员——没有全局常数、全局变量,也没有全局方法。
数组型参数:若形参表中包含了数组型参数,那么它必须在参数表中位于最后。另外,参数只允许是一维数组。最后,数组型参数不能再由ref和out修饰符。
11.3静态方法和非静态方法
静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例。非静态方法可以访问类中的任何成员,而静态方法只能访问类中的静态成员。
窗口句柄是Windows操作系统中保存窗口相关信息的一种数据结构,我们在这个例子中简化了对句柄的使用)。
11.4方法的重载
11.5操作符的重载
为什么操作符的重载都使用静态方法?
域的默认初始化分为两种情况:对于静态域,类在装载是对其进行初始化;对于非静态域,在类的实例创建时进行初始化。在默认的初始化之前,域的值是不可预测的。
Class Test
{
Static int a=b+1;
Static int b=a+1;
}
合法
实际上等于a=1,b=2;
Class A
{
Int x=1;
Int y=x+1;
}
不合法,非静态变量x在类A实例化以前并没有初始化。
C#中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是通过访问其进行访问。它借助于get和set对属性的值进行读写。
12.2.2访问属性的值
除了使用了abstract修饰符的抽象属性,每个访问器的执行中只有分号“;”,其他所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
12.3小结
描述一个类的特性有两种方式,一种是通过域,一是通过属性。域作为public类型的成员变量访问,而属性不能直接进行访问,必须通过访问其(accessors)进行。
在
C#
中,包(
Package
)被称为名称空间。把名称空间引入
C#
程序的关键词是
“using”
。例如,
“using System;”
这个语句引入了
System
名称空间。
在
C#
中,物理的包和逻辑的名称之间是完全分离的,也就是说,名称空间的名字不会对物理的打包方式产生任何影响。在
C#
中,每一个源代码文件可以从属于多个名称空间,而且它可以容纳多个公共类。
.NET
中包的实体称为程序集(
Assembly
)。每一个程序集包含一个
manifest
结构。
manifest
列举程序集所包含的文件,控制哪些类型和资源被显露到程序集之外,并把对这些类型和资源的引用映射到包含这些类型与资源的文件。程序集是自包含的,一个程序集可以放置到单一的文件之内,也可以分割成多个文件。
.NET
的这种封装机制解决了
DLL
文件所面临的问题,即臭名昭著的
DLL Hell
问题。
sealed
修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,
sealed
修饰符必须始终与
override(C# 参考)
一起使用。
三、操作符重载
1
、操作符重载
C#
中对操作符重载的一些限制:
l
必须声明为public static
l
必须有一个参数为操作符所属类型
l
不能改变操作符原始定义的引数个数
l
若定义了true操作符也必须同时定义false操作符,二者都必须返回bool值
l
、--操作符必须返回其所隶属之类型的一个实例
l
可被重载的一元操作符: 、-、!、~、 、--、true、false
l
可被重载的二元操作符: 、-、*、/、%、!、^(异或)、<、>、<<、>>、==、!=、<=、>=
l
不允许被重载的操作符:&&、||、=、?:、 =、-=、/=、%=、|=、^=、<<=、>>=,实际上其中一些“复式操作符”在二元操作符被重载后自动生成,而不能显式定义
l
必须成对重载的操作符:(== ,!=)、(<,>)、(<=,>=)
l
、--操作符重载时不能区分其为前置或后置的
2
、操作符重载与语言互操作性
编译器会为重载的操作符生成一个特殊名称的方法,如 (加)操作符生成op_Addition()方法,并为该方法的定义条目上加上specialname标记。当某种语言不能进行操作符重载时,可以直接定义具有该特殊名称的方法,以在其他语言中调用;或直接调用具有该特殊名称的方法以适应某种语言不能解析操作符的限制。如:vb中不能重载操作符,可显式定义op_Addition()方法以在C#中调用;C#中定义的 操作符不能被VB识别,可显式调用op_Addition()方法获得同样的功能。