类(class)
对象(object):类的实例。
传参:包括按值传参和按引用传参。
按值传参时,传的是参数的副本,方法内部对参数的改变不改变参数本身。按引用传参时,传的是实例的引用,方法内对参数的改变影响参数本身。
常量:定义时就必须初始化,但可以计算。例如 public const int A = 1; public const int B = A + 1;
枚举:[性质] [修饰符] enum 标识符 [:基类型] {枚举列表}
标识符即枚举的名字。基类型默认是int,可为除char外的任意整数类型。枚举列表内容以逗号分隔,项目的值默认从0开始,后一个比前一个多1。例如 enum Values { x, y, z = 20, i, j } 其中x=0,y=1,z=20,i=21,j=22。
构造方法:CLR底层将所有字段清零,创建一个有效对象,然后执行用户自定义的构造方法。
静态构造方法:没有访问修饰符,不能访问非静态成员变量。静态构造方法必须保证在创建实例前运行。
静态类:不能派生子类,不包含非静态成员,没有构造方法,不能被实例化。
静态字段:通常用来表示类的实例数目。例如:
public class Cat
{
// 静态字段不会在创建实例时初始化,所以必须在类中初始化。
// 编程时最好将成员数据设为私有,调用方法显示数据内容。
private static int count = 0;
// 构造方法,直接使用静态字段
public Cat () { count++; }
// 调用静态字段的静态方法
public static HowManyCats () { Console.WriteLine ( "{0} cats adopted", count ); }
}
析构方法与Dispose、Close方法
析构方法由编译器调用,用户无法主动调用。
Dispose:要自定义Dispose方法需实现IDisposable接口。
Close:可将Dispose方法建为私有,设Close为公共方法,用Close内部调用Dispose方法。
using语句:用大括号括起来的部分,运行结束后调用Dispose方法。
无论如何离开using,Dispose都会被调用,类似于隐藏的try - catch - finally块。
签名:是用方法名和参数列表定义的,其中有一个不同,签名就不同。
多态:类 - 继承。
方法 - 重用。基方法用virtual修饰,派生方法用override修饰,用base调用基类方法,用派生类的对象直接调用派生类方法。
例如 public class Control {
public Control { ... } // 构造方法
public virtual void DrawWindow () { ... }
}
public class ListBox : Control {
public ListBox : base { ... }
public override void DrawWindow () { ... }
}
抽象类(abstract):
1. 若一个方法被定义为抽象的,他所在的类也是抽象的。
2. 抽象类不可创建对象(不可实例化)。
3. 抽象方法没有实现,只创建方法名和属性。
4. 如抽象类的派生子类没有实现基类的所有抽象方法,派生子类也是抽象的。
5. 抽象类对派生类的派生子类不用强制实现抽象类的抽象方法,例如 抽象类Control,派生类ListBox,ListBox的派生子类DropListBox,DropListBox不用实现Control的抽象方法。
6. 与抽象类同效果的做法是定义接口,由类实现接口。
密封(sealed):密封类不允许被继承。
嵌套类:
1. 嵌套类的方法可访问外层类的所有成员(包括私有成员)。
2. 创建嵌套类的实例须指定外层类的类型名,例如 Outer是外层类,Nested是嵌套类,Nested实例化为 Outer.Nested a = new Outer.Nested ()
3. 嵌套类作用域仅在外层类中。
结构体:
1. 结构体是值类型,类是引用类型。
2. 结构体不支持继承和析构函数。
3. 结构体数组(类型一致)内存使用方面效率好,非类型一致集合中效率差;类在大的集合中效率好。
4. 结构体没有析构函数或自定义的默认构造方法。
5. 结构体不能初始化。
6. 结构体可以继承多个接口。
7. Console.WriteLine ( "{0}", num ); // int num = 0;
* 如果只用结构体,则结构体/值类型会封装成对象,然后调用object的ToString方法。如果不想封装,则写成
Consolr.WriteLine ( "{0}", num.ToString() ); 因为值类型都会覆盖ToString方法。
接口:
1. 一般接口名的首字母是I。
2. 接口方法隐含就是public,所以不需有访问修饰符。
3. 可利用接口的继承性扩展和组合接口。
4. as操作符检查是否实现接口,若实现,转换为接口类型,若没有,返回null。
5. 显式实现接口不能用访问修饰字,隐含为公共;不能通过对象本身访问,必须转换成接口,例如:
interface IStorable {
void Read ();
void Write ( Object obj );
}
class Document : IStorable {
void IStorable.Read () { ... }
void Write ( Object obj ) { ... }
}
调用
Document doc = new Document ();
IStorable istor = doc as IStorable;
if ( istor != null ) istor.Read ();