一、类
— 抽象类:
— 抽象类只能被用作其它类的基类,就是被设计来继承的;
— 不能创建抽象类的实例;
— 抽象类使用abstract修饰符声明;
— 抽象类可以包含抽象成员,但不是必须的;
— 抽象类的成员可以是抽象成员和普通带实现的成员的任意组合;
— 抽象类可以自己派生自另外一个抽象类;
— 任何派生自抽象类的类必须使用override关键字属性该类所有的抽象成员,除非派生类自己也是抽象类;
— 密封类:
— 它与抽象类相反;
— 它只能被用作独立的类,它不能被用作基类;
— 它使用sealed修饰符标注;
— 静态类:
— 它的一个普通的用途就是创建一个包含一组数学方法的数学库;
— 类本身必须标记为static;
— 类的所有成员必须是静态的;
— 类可以有一个静态构造函数,但没有实例构造函数,不能创建该类的实例;
— 不能继承静态类,它们是密封的;
— 访问使用类名和成员名;
— 分部类:
— 可以在同一文件和不同文件中;
— 每个局部声明必须被标识为 partial class (class不是关键字);
— 组成类的所有分部类必须在一起编译;
— 还可以为局部接口和局部结构创建分部类;
二、属性
— 属性
— 定义:是代表类的实例或类中的一个数据项的成员;
像字段:它是命名的类成员、有类型、可以被赋值和读取;
不像字段:它是函数成员、不为数据存储分配内存、它执行代码;
— set访问器:一个单独的、隐式的值参,名称为value,与属性的类型相同; 一个返回类型void;
get访问器:没有参数;一个与属性类型相同的返回类型;
— 关联字段:和属性关联的字段通常称为后备字段或后备存储;
— 可以有只读和只写属性,但两个访问器至少有一个必须定义;
— 自动实现属性:
— C# 3.0 增加的(automatically inplemented);
— 不声明后备字段,编译器根据属性的类型分配存储;
— 不提供访问器的方法体,它们被简单地声明为分号;
— 除非通过访问器,否则不能访问后备字段;
— 静态属性:
— 不能访问类的实例成员,虽然它们能被实例成员访问;
— 它总是存在,不管类是否有实例;
— 当从类的外部访问时,必须使用类名引用,而不是实例名;
三、构造函数和析构函数
— 实例构造函数:
— 它是用于初始化实例的状态;
— 构造函数的名称和类名相同;
— 如果希望从类的外部创建实例,需声明为public;
— 不能有返回值;
— 可以被重载;
— 可以带参数;
— 默认构造函数:
— 如果定义了构造函数,那么编译器就不会为该类定义默认构造函数;
— 它不带参数;
— 它的方法体位空;
— 静态构造函数:
— 通常,它是初始化类的静态字段;
— 在任何静态成员被引用之前;
— 在类的实例被创建之前;
— 不能返回值;
— 只能有一个静态构造函数;
— 不能带参数;
— 不能有访问修饰符;
— 不能从程序中显示调用,它是被系统自动调用的;
— 不能访问所在的类的实例成员,因此也不能使用 this 访问器;
— 析构函数(destructor)
— 定义:它是执行在类的实例被销毁之前需要的清理或释放非托管资源的行为;
— 名称和类名相同,但以一个“~”字符作前缀(发音为 TIL-duh);
— 每个类只能有一个析构函数;
— 不能带参数;
— 不能带访问修饰符;
— 只对类的实例起作用,因此没有静态析构函数;
— 如果不需要,就不要执行,它会带来性能上的开销;
— 它只应释放对象自己的外部资源;
— 调用析构函数:
— 采用标注清理模式;
— 调用IDisposable接口中的Dispose方法清理;
— 调用GC.SuppressFinalize方法告诉CLR不要调用析构函数;
四、方法
— 参数类型
— 值参数:
方法被调用时,在栈中为形参分配空间;
复制实参到形参;
调用完后,实参不变;
— 引用参数:
必须在方法的声明和调用中都使用 ref 修饰符;
实参必须是变量,在用作参数前必须被赋值;
不在栈中为形参分配新的内存;
形参的名称相当于实参变量的别名,引用与实参相同的存储位置;
调用完后,实参会变;
— 输出参数:
必须在方法的声明和调用中都使用 out 修饰符;
实参必须是变量,不能是其他表达式类型;
在方法内部,输出参数在被读取之前必须被赋值;
— 参数数组:
在数据类型前使用 params 修饰符,在数据类型后放一组空的方括号;
它允许零个或多个实参对应一个特殊的形参;
在一个参数列表中只能有一个参数数组,如果有,必须是最后一个;
方法调用:有延伸式调用 :void ListInts(params int[] invals){…} //方法声明
ListInts();ListInts(1,2,3); //延伸式调用
数组作参数式调用:int MyArr = new int[] {1,2,3} //数组作参数式调用
MyClass mc = new MyClass();
mc.ListInts(MyArr);
— 方法重载(method overload)
— 定义:一个类中可以有一个以上的方法拥有相同的名称;
— 不同的方法签名(signature)的信息组成也不同;
— 方法签名的信息组成有:
— 方法的名称、参数的数目、参数的数据类型和顺序;
— 返回类型和形参的名称不是签名的一部分;
— 形参的名称不是签名的一部分;
— 扩展方法(C# 3.0)
— 它允许编写和声明它的类之外的类关联的方法;
— 它必须被声明为 static;
— 它声明所在的类也必须被声明为 static ;
— 它必须包含 this 作为它的第一个参数类型,并在后面跟着他所扩展的类的名称;
— 外部方法(external method):
— 它是在声明中没有实现的方法,现在常常是用C#之外的语言必须的;
— 它使用 externa 修饰符标记,在类的声明中没有实现,而是被分号代替;
— 声明和实现的连接时是依赖实现的,但常常使用DllImport特性完成;
— 虚方法和覆写方法:
— 它可以使基类的引用访问至派生类;
— 派生类的方法和基类的方法有相同的签名和返回类型;
— 基类的方法使用 virtual 标注;
— 派生类的方法使用 override 标注;
— 覆写和被覆写的方法必须有相同的可访问性;
— 不能覆写 static 方法或非虚方法;
— 覆写方法可以在继承的任何层次出现;
— 方法、属性和索引,以及事件的,它们都可以声明为virtual和override;
— 分部方法:
— 在分部类中声明在两个部分中的方法,可以在(不)同一分部类中;
— 定义声明,给出签名和返回类型,实现部分是一个分号;
— 实现声明,给出签名和返回类型,还有语句块;
— 两个声明都必须包含partial,直接放在void前;
— 签名不能包含访问修饰符,这使分部方法是隐式私有的;
— 返回类型必须是void;
— 参数列表不能包含out参数;
— 可以有定义部分而没有实现部分,反之,不行;
五、索引
— 定义:
— 索引是一组get和set 访问器,类似于属性的访问器;
— 不用分配内存来存储;
— 主要是用来访问其他数据成员;
— 索引通常访问多个数据成员,属性通常访问单独的数据成员;
— 声明:
— 使用没有名称,在名称的位置是关键字 this;
— 可以有访问修饰符和类型;
— 参数列表在方括号 [ ] 中间;
— 有set 和get 访问器;
— 调用:
— 不能被显式调用;
— 可以重载(引用类型不同时不够的,还必须要不同的参数列表);
— 访问器的访问修饰符:
— 限制条件有:仅当成员(索引或属性)既有set和get访问器、
— 它们中只能一个能有访问修饰符、必须比成员有更严格的限制:Public—protected internal—protected \ internal—private;
|