第八章
1、字段、属性
a 、属性不能直接访问数据,属性可以限制值的范围。
b、在访问状态时,最好提供属性,而不是字段,这样可以更好的控制整个过程。属性和字段的语法上相同的。
c、对属性的访问可以由对象来明确定义。如某些属性是只读的。
2、对象的生存周期
a、构造函数:对象最初进行实例化的时期。这个过程成为构造阶段。
b、析构函数:在删除一个对象时,常常需要执行一些清理工作,如释放内存,这个由析构函数完成。
3、静态和实例类成员
a、属性、方法和字段等成员是对象实例所特有的,除此之外,还有静态成员,如静态方法、静态字段、静态属性。静态成员可以在类的实例之间共享,所以可以将它们看作类的全局对象。静态属性和静态字段可以访问独立于任何对象实例的数据,静态方法可以执行与对象类型相关,但与对象实例无关的命令。
b、静态构造函数、静态类
4、接口
a、接口是把公用方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。这样类就可以支持接口所指定的所有属性和成员。
b、接口不能单独存在,不能实例化。接口不能包含实现其成员的任何代码。只能定义成员本身。实在过程必须在实现接口的类中实现。
c、接口发布后,最好不要修改它。我们可以创建一个新的接口,来扩展旧接口。
d、idisplsable接口。支持idisposable接口的对象必须实现其dispose()方法。当不需要某个对象的时候(如在对象超出作用域之前),就调用这个方法,释放重要的资源,否则,该资源会等到垃圾回收调用析构方法来释放。
e、using关键字可以在代码块中初始化使用重要资源的对象,dispose()方法会在这个代码块的末尾自动调用。
f、接口也可以继承自其它接口,与类不同的是,接口可以继承多个基接口。
g、接口是组合相关的属性和方法。尽管不能像对象那样实例化接口,但可以建立接口类型的变量。
然后就可以在支持该接口的对象上,使用这个变量访问该接口提供的方法和属性。h、派生类会继承其基类支持的接口。有共同基类的类不一定有共同的接口。有共同接口的类也不一定有共同的基类。
5、继承
a、任何类都可以从另一个类中继承,这个类拥有它继承的类的所有成员。C#的对象仅能直接派生于一个基类。基类也可以有自己的基类。
b、派生类不能访问基类的私有成员,但可以访问共有成员。不过派生类和外部的代码都可以访问公共成员。protected,只有派生类才能访问protected成员。对于外部代码来说,这个可访问性与私有成员一样。外部代码不能访问private成员和protected成员。
c、除了定义成员的保护级别外,我们还可以为成员定义其继承行为。基类的成员可以说虚拟的,成员可以由继承它的类重写。派生类可以提供成员的其他执行代码。这种执行代码不会删除原来的代码,仍可以在类中访问原来的代码,但外部的代码不能访问它们。如果没有提供其他执行方式,外部代码就访问基类中成员的执行代码。
d、虚拟成员不能说私有成员,因为这样会自相矛盾-----不能说成员可以由派生类重写,同时派生类又不能访问它。
e、基类可以定义为抽象类,抽象类不能直接实例化。要使用抽象类,必须继承这个类。抽象类可以有抽象成员,这些成员在基类中没有执行代码,这些执行代码必须在派生类中提供。
f、类可以说密封的,密封的类不能用作基类,所以没有派生类。
【对于第八章后面,多态性,对象之间的关系、运算符重载、事件、理解的不够好,需要反复阅读和理解!!!】
第九章
1、类定义
a、在默认情况下,类声明为内部的,即只有当前项目中的代码才能访问,可以用internal修饰符显示指定,但不是必须的。设置为public说明可以由其他项目中的代码来访问。
b、抽象类:不能实例化、只能继承、可以有抽象成员,密封类:不能继承
在C#的类定义中,只能有一个基类。如果继承了一个抽象类,就必须实现所继承的所有抽象成员(除非派生类也是抽象的)
c、派生类的可访问性不能比基类更高。内部类可以继承于一个公共类,但公共类不能继承于内部类。如果没有定义基类,那么会继system.object.
2、类库
a、类库项目可以编译为.dll程序集,在其他项目中添加对类库项目的引用。因为类库可以进行修改和更新,而不会影响使用他们的其他项目。
3、接口和抽象类
a、相同点:都包含可以由派生类继承的成员。接口和抽象类都不能实例化,却可以声明他们的变量。如果这样做,就可以使用多态性把继承这两种类型的对象指定给他们的变量,可以使用这些恶变量来使用这些类型的成员,但不能直接访问派生对象的其他成员。
b、区别:派生类只能继承一个基类,即只能直接继承一个抽象类(但可以用一个继承链包含多个抽象类)。相反,类可以使用多个接口,但这不会产生太大的区别,这两种情况得到的效果是类似的。只是采用接口的方式略有不同。
c、抽象类可以拥有抽象成员和非抽象成员
*抽象成员:没有代码体,且必须在派生类中实现,否则派生类必须本身也是抽象的
*非抽象成员:拥有代码体,也可以说虚拟的,这样就可以在派生类中重写。
接口成员必须都在使用接口的类上实现---它们没有代码体。另外,接口成员是公共的(因为它们倾向于在外部使用),但抽象类的成员可以是私有的(只要他们不是抽象的)、受保护的、内部的或者受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或者派生类中访问)
接口不能包含字段、构造函数、析构函数、静态成员或者常量。
这说明这两种类型用于完全不同的目的,抽象类主要用做对象系列的基类,共享某些主要特性,例如,共同的目的和结构。
接口主要用于类,这些类在基础水平上有所不同,但仍可以完成相同的任务!
4、结构类型是指类型,类是引用类型
a、引用类型在把对象赋给变量时,实际上是把带有一个指针的变量赋给了该指针所指向的对象。在实际代码中,指针是内存中 的一个地址。在这种情况下,地址是内存中该对象所在的位置。在把第一个对象引用赋给类型为Myclass的第二个变量时,实际上是复制了这个地址。这样两个变量就包含同一个对象的指针。
b、结构是指类型,其变量并不是包含结构的指针,而是包含结构本身。在将一个结构赋给类型为另一个结构变量时,实际上是把第一个结构的所有信息复制到另一个结构中。
c、从一个变量到另一个变量复制对象,而不是按引用复制对象,可能非常复杂,因为一个对象可能包含许多其他对象的引用。例如:字段成员等。这将设计到很多繁琐的操作。把每个成员从一个对象复制到另一个对象可能不会成功,因为其中一些可能是引用类型。
第十章(定义类成员)
1、定义字段
a、.net中的公用字段用PascalCasing来命名,而不是camelCasing.私有字段通常采用camelCasing方式来命名。
b、readonly表示这个字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。const成员也是静态的,所以不需要用static来修饰。
c、virtual:方法可以重写,abstract:方法必须在非抽象的派生类中重写(只用于抽象类中),override:方法重写了一个基类方法(如果方法被重写必须使用该关键字。),extern:方法定义在其他地方。如果使用了override,也可以使用sealed指定在派生类中不能对这个方法进一步的修改。这个方法不能由派生类重写。
2、定义类成员
a、还可以在访问器上包含可访问修饰符,例如把get块变成公共的,把set块变成受保护的。属性至少要包含一个块,才是有效的。公共属性也同样采用PacalCasing方式来命名。
3、隐藏基类方法(不大懂,多注意看)
a、可以使用new关键字显示的说明隐藏成员。
b、无论是重写成员还是隐藏成员,都可以在派生类的内部访问基类成员。这在很多情况下都是很有用的:
如:要对派生类的用户隐藏继承的公共成员,但仍能在类中访问其功能。
如:要给继承的虚拟成员添加执行代码,而不是简单地用重写的新代码替换它。