字段与属性博客传送门
①方法签名的组成:方法签名是由方法名称、方法的参数类型和方法的参数修饰符共同组成的。
②编译器区分重载方法的方式:编译器通过签名不同来区分不同的重载函数,而不能通过返回值类型进行区分。
在使用一个类的构造方法时,在构造方法的方法头后面用一个冒号然后加上this(),如果有参数还可以带参数。具体示例可以参考如下:
public Person():this(0,"")
{
构造函数方法体语句
}
不能用this指向类中的静态变量;也不能在类的静态方法中使用this。
匿名类是指只是用于临时定义而无需命名的类。匿名类的定义方式可以参照如下:
new{Title="C#",Author="Tang",Price=1.5}
①索引器的作用:索引器使得用户可以使用访问数组的语法来访问这个类的成员。
②索引器的定义:索引器的定义语法如下所示:
修饰符 类型名 this[参数列表]
{
set{...}
get{...}
}
③索引器的下标:和数组中只能使用整数作为下标不同,索引器的下标可以是任意类型的参数。
④索引器的重载:索引器的重载要求索引器的参数列表不同。也就是要么参数个数不同,要么参数类型不同。
⑤索引器的嵌套调用:在同一个类中,索引器可以通过以下语法调用另一个索引器:
this[参数列表]
⑥索引器不能定义为static类型。
C#中不支持多类继承。
①子类的方法新增:C#中子类可以定义一个与父类签名相同的方法,但是需要在方法定义前加上一个修饰符new,否则编译器会给出警告信息。新增方法会带来理解的困难和歧义,因此一般不使用。
②子类中的方法覆盖:C#中也可以通过子类的覆盖来定义与父类中签名相同的方法。此时父类中的方法需要用virtual修饰,而子类中的方法用override修饰。
①base指的是当前对象对应的父对象。
②base的适用情况:使用base可以访问被子类覆盖了的同名变量以及同名方法;同时,有时为了突出对父类的使用,也会使用base关键字。
③适用base调用父类的构造方法:在子类的构造方法定义中,可以在方法签名后加上一个冒号,冒号后用base关键字即可调用父类的构造方法。
①as运算符的作用:as运算符用于引用类型的强制类型转换
②as运算符的语法
表达式 as 类型名
③as运算符和强制类型转换的比较:与强制类型转换相比,as运算符只能用于引用类型,并且如果不能发生转化会使得运算结果为null,而强制类型转换失败则会抛出异常。
①C#中的访问控制符:public protected private internal 以及protected internal。
②internal控制符:internal表示同一个程序集中可访问,protected internal是指protected和internal的并集。
③默认访问控制符:类成员和结构成员的默认访问控制符是private,名称空间、接口和枚举的默认访问控制符是public。
①静态构造函数:静态构造函数是类的用static修饰的构造函数,一个类最多只能有一个静态构造函数。一般的构造函数对新创建的对象进行初始化,而静态构造函数对类本身进行初始化,常常在初始化类中的静态属性或字段时使用。
②静态类的概念:如果定义类时用static修饰则表示这个类是静态类。静态类的所有成员都是静态的。
③静态类的语法糖:如果用using语句导入一个静态类,那么可以省略类名而直接写方法名。
①密封类的定义:使用sealed修饰的类即为密封类,密封类不能被继承。一般被定义为sealed的类都有固定作用。
②密封方法的定义:为了防止子类进一步对父类的虚方法进行覆盖,可以用sealed关键字修饰override方法。
①抽象类和抽象方法的概念:所有使用abstract修饰的类或方法就是抽象类或抽象方法。
②抽象类的构造函数:抽象类虽然不能进行实例化,但是可以有构造函数并且可以被子类的构造函数调用。
③抽象类和抽象方法的关系:如果一个类中包含了抽象方法,那么这个类必须声明为抽象类。
④其他注意事项:抽象方法一定是非静态方法;抽象方法必须用除了private之外的访问控制符修饰;子类在实现抽象类的抽象方法时需要使用override关键字进行修饰;abstract关键词和virtual关键词不能同时用于修饰一个成员。
⑤覆盖的嵌套:一个已经被override的成员可以在其子类中继续覆盖。
①接口的作用:一个类可以通过实现多个接口来实现类似于多重继承的目的。
②接口的成员:接口的成员必须是抽象的方法或属性,这些抽象成员都不能有实现体。
③接口的访问控制:接口隐含是public的,接口内的成员不能用任何修饰符进行修饰。
④接口的命名习惯:按照编码惯例,接口的名字都用大写字母 I 开头。
⑤接口的实现:接口可以用类来实现,也可以用结构实现。在类或结构的声明部分,用冒号表示父类和要实现的若干个接口,其中父类一定要写在接口的前面。如果一个类实现了某个接口,则要求这个类中一定可以找到该接口的各个成员的相应的成员。
⑥接口的引用:接口本身也可以作为一种引用变量。当一个方法需要以接口作为参数时,可以将一个实现了该接口的类的对象作为参数进行传入。
⑦显式接口成员实现:有时一个类继承了多个接口,而这些接口中有签名相同的虚方法或其他成员,则直接使用方法则有可能导致重名的歧义问题,此时就可以进行显式接口成员实现,语法为接口名.方法名。
①结构和类的简单对比:接口是值类型,而类是引用类型;结构不支持继承;结构存储在栈中,而类存储在堆中。
②结构的适用情况:结构适用于比类更简单的对象,适合于表示点、矩形和颜色等这样简单的数据结构。在创建对象较多时(如数组)最好使用结构。
③类的适用情况:作为方法的参数时,以类作为参数的效率远高于以结构作为参数。
④结构的其他注意事项:
(1)结构不能有无参构造方法。可以认为系统为每一个结构都定义了一个无参构造方法,用默认值来初始化结构中的字段。如果定义构造方法,则需要在构造方法中每一个字段赋初值。
(2)结构中每个字段定义时不能赋初始值。
(3)结构不能有析构方法。
⑤不使用new的结构初始化:结构变量定义时可以不用new运算符,此时系统按照默认值初始化结构成员。
⑥结构的定义方法:结构的定义语法如下所示:
struct 结构名 [:接口名]
{
...
}
①枚举类型概述:枚举类型派生自System.Enum,这种类型用一组符号常数提供了一个类型名称。在枚举中的每个成员实际上是一个符号常数。
②枚举类型的定义:枚举类型的定义语法如下:
enum 枚举名 [:基本类型名]
{
枚举成员 [=常数表达式]
......
}
③枚举类型的基本类型:每个枚举类型都以一个整数类型作为基本类型,可以在定义中声明;如果没有声明则默认为int类型。
④枚举类型成员和整数转换:枚举类型与整数的类型转换需要使用强制转换。常数0可以隐式地转换为任何类型。
⑤枚举类型和字符串转换:枚举类型可以通过ToString()方法转换为名称字符串,使用Enum类的静态方法Parse可以将一个枚举常数字符串转换为等效的枚举对象,语法如下:
Enum.Parse(枚举类型名,待转换字符串)