C基础知识需要特别注意的知识点

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《C#4.0本质论》学习笔记

1.装箱:将一个值类型转换成一个引用类型

1)首先在堆中分配好内存;

2)一次内存复制:栈上的值类型数据复制到堆上分配好的位置;

3)对象或接口引用得到更新,指向堆上的位置。

2.拆箱:将一个引用类型转换为值类型

3.装箱频繁发生,会大幅影响性能;

4.不允许在lock()语句中使用值类型。

三、String 与StringBuilder

1.String对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的

2.StringBuilder此类表示值为可变字符序列的类似字符串的对象

3.String 对象串联操作总是用现有字符串和新数据创建新的对象。StringBuilder 对象

维护一个缓冲区,以便容纳新数据的串联。如果有足够的空间,新数据将被追加到

缓冲区的末尾;否则,将分配一个新的、更大的缓冲区,原始缓冲区中的数据被复

制到新的缓冲区,然后将新数据追加到新的缓冲区。

4.String 或StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String

串联操作每次都分配内存,而StringBuilder 串联操作仅当StringBuilder 对象缓冲

区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的String 对象,

则String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到

一个操作中。如果串联任意数量的字符串,则StringBuilder 对象更适合串联操作;

例如,某个循环对用户输入的任意数量的字符串进行串联。

四、? 和??的使用

1.可空修饰符?:为了声明可以存null的值类型变量。int ?x=null;

2.使用??运算符分配默认值:expression1??expression2.检查第一个表达式是否为

null,如果为null,则返回第二个表达式。

3.当前值为空的可以为null 的类型被赋值给非空类型时将应用该默认值,如int? x =

null; int y = x ?? -1;。

三、const和readonly

1.const:

1)既然用于修饰字段,又可以修饰局部变量;

2)是在编译时确定的值,不可以在运行时改变;

3)自动成为静态字段,不能显式声明为static

2.readonly:

1)只能用于字段(不能用于局部变量),

2)指出字段值只能从构造函数中更改,或者直接在声明时指定。——可以在运行时赋值;

3)readony字段既可以是实例字段,也可以是静态字段.

四、静态成员和实例成员

1.静态字段:主要存储的是对于类的数据,能由多个实例共享,需要使用static关键

2.实例字段:存储的是与对象关联的数据,只能从类的一个实例(对象)中访问实例

字段。

3.静态方法:不能直接访问一个类中的实例字段,必须获取类的一个实例,才能调用

任一实例成员(方法或字段)。

4.实例方法:将需要访问实例数据的方法声明为实例方法。

5.静态构造函数:用来对类(而不是类实例)进行初始化。

运行时会在“访问类的一个静态方法或者字段时”自动调用静态构造函数。

6.静态类:不包含任何实例字段(或方法),声明时用static 关键字。不能被实例化,

不能被继承。

五、继承:对一个现有的类型进行扩展,以包含附加的成员或实现对基类成员的定制。

1.protected 访问修饰符:在基类中定义只有派生类才能访问的成员。

规则:要从一个派生类中访问一个受保护的成员,必须在编译时确定受保护的成员

是派生类(或者它的某个子类)的一个实例。

2.C#是一种单一继承的语言,一个类不能直接从两个类派生。

3.可以使用聚合解决多重继承的问题

4.使用sealed修饰符,实现密封类(不能被继承)

5.C#支持重写实例方法和属性,但不支持重写字段或者任何静态成员。

1)在基类中使用virtual修饰符标记每一个需要重写的成员,

2)在派生类中,用override进行修饰。C#要求重写方法显式地使用override关键字。

3)重写一个成员时,会造成“运行时”调用派生得最远的实现。

4)new 修饰符:在基类面前隐藏了派生类的重新声明的成员。

6.抽象类:

1)仅供派生的类,不能被实例化。

2)包含抽象成员:不具有实现的一个方法或属性,强制所有派生类提供实现。

7.多态性:同一个签名可以有多个实现。

1)抽象成员是实现多态性的一个手段:基类指定方法的签名,派生类提供具体的实现;

2)可以利用多态性:调用基类的方法,当方法具体由派生类实现。

8.is 和as运算符

1)is运算符验证基础类型

2)使用as运算符进行转换:将对象转换为一个特定的数据类型,若源类型不是固有的目标类型,as运算符会将null值赋给目标。

六、接口

1.对接口的理解:

1)接口定义了一系列成员,不包含任何实现,由继承该接口的类实现;

2)接口实现关系是一个“能做”关系:类“能做”接口要求的事情;

3)接口定义了一个“契约”:实现接口的类会使用与被实现的接口相同的签名来定义方法。

4)接口的宗旨是:定义由多个类共同遵守的一个契约,所有成员都自动定义为public。

5)C#不允许为接口成员使用访问修饰符。

6)通过接口可以实现多态性;

7)不能被实例化,不能使用new关键字来创建一个接口。

2.接口实现:

1)一个类只能从一个基类派生,但可以实现多个接口;

2)显式实现:为了声明一个显式接口成员实现,需要在成员名之前附加接口名前缀。

String[] IListable.ColumnValues

{

…….

}

通过接口本身来调用它——将对象转型为接口;

Values=((IListable)contact1).Columnvalues

3)隐式实现:类成员的签名与接口成员的签名相符。

调用时不需要转型,可以直接调用。

4)成员若是核心的类功能,则隐式实现;

5)假如一个成员的用途在实现类中不是很明确,就考虑使用一个显式的实现;

6)已经有一个同名的类成员,则可以使用显式实现。

3.接口继承:

1)一个接口可以从另一个接口派生,派生的接口将继承“基接口”的所有成员;

2)在用于显式接口成员实现的一个完全限定的接口成员名称中,必须引用最初声明它的那个接口的名称;

3)继承:接口代表一份契约,而一份契约可指定另一份契约也必须遵守的条款。

4)通过接口可以实现多重继承。

4.

相关文档
最新文档