亮剑.NET第二章
第二章主要讲解C#中各种让人模糊不清的概念,用法,类型等等。
1.Equals()与==区别
当比较两个值类型时,二者基本一致,当比较引用类型时,==比较的是引用类型的地址是否一致,即两个引用是否指向同一个堆,Equals()比较的是两个引用指向的堆空间的内容是否一致。注意:当用一个引用类型对象A给另一个引用类型对象B赋值时,并不是复制一份堆,再把B指向堆,而是直接把A的值,即A指向的堆的地址给B,AB指向同一个堆。
2.const与readonly区别
const是编译时确定值,所以它只能用常量赋值。object,Array,struct不能声明为const。
readonly是运行时确定值,可以用变量来赋值,它可以在构造函数中赋值,实现动态的常量表示,更灵活。
3.private,protected,public,internal
(1)private只能类自己内部调用
(2)protected只能类自己和派生自自己的子类调用
(3)public完全开放
(4)internal只能在同一程序集内访问,即在同一个项目内,不是同一个解决方案。
(5)protected internal只能在同一个程序集的类自己和派生自自己的子类调用
4.
sealed将类变为密封类,不能被继承。将方法变成密封方法,不能被重载
new显示隐藏从基类继承的成员,不使用new也能隐藏,但是会警告。
virtual声明虚方法,不具体实现,在子类中实现。
abstract声明抽象类,抽象方法,派生的子类必须实现所有抽象类中未实现的方法。
override覆盖virtual或者abstract修饰的方法
new和override相同点:都能对基类的方法进行隐藏,都可以用base关键字调用基类的成员
new和override不同点:(1)override隐藏的只能是virtual或者abstract修饰的方法,new不必要(2)当使用一个基类调用virtual方法时,如果使用override重写了方法,那么会调用该重写方法,但是用new重写的话还是会调用基类的virtual方法
5.abstract class与interface
6.公共变量与属性的区别
如果使用公共变量,那么可以在类的外部随意的访问控制该成员变量,违背了面向对象中的封装思想。
使用属性,对属性的访问受限于类自身对于属性的设置,不直接操作类的数据内容,而是通过访问器来访问,例如借助于get{}set{}来读取写入数据,还有更多种用法,例如在更改前验证数据等等。
属性是对字段(数据)的封装。
属性可以控制读写,变量不可以。
因此:当我们要把类中的一个值设为public时,尽可能使用属性来代替变量。
7.params,out,ref
params:使得函数的参数的个数是可变的。
void f(params int[] list){..}则下列用法都可以。f(1,2);f(1,2,3);int[] ints={1,2,3};f(ints);
void f(params object[] list){..}f(1,2.23,"123");
out:一个引用传递
使用out修饰参数时,函数的定义和调用时都要显式加out关键字,void f(out int i){....} int i;f(out i);对于i赋不赋值都无所谓,因为在进入函数时,i会被清空。因此i不能传入值都函数内部,只能从函数内将值带出。它必须在函数内部被赋值,因为它本身没有值,C#不接受一个只有地址没有值得变量,会报错。
ref:仅仅是一个地址
同样在函数的定义和调用时都要显式加ref关键字,使用ref修饰的参数传递前必须初始化,因为它传入后值不会清空,所以必须初始化,因为它本身已经有了值,所以可以在引用它的函数内部不作改变。
8.值类型和引用类型的区别
值类型存储的是数据。分配在栈中,=操作是复制本体一份。
引用类型是一种行为。分配在堆中,=操作是将堆的指针复制一份。
9.结构体与类的区别
结构体是值类型
类是引用类型
10.string和StringBuilder的区别
string对象是不可变的,string i="a";i+="b";此时i为ab,貌似string是可以改变的,其实不然,当进行+=操作时是重新创建了一个string对象,赋值ab,原先的string被丢弃,string不能使用new string()来构造一个string对象。
StringBuilder是可变的,它专门用来处理动态变化字符类。StringBuilder str=new StringBuilder("a");str.Append("b");
相对来说,如果对字符串要进行大量的动态变化,最好用StringBuilder,因为使用string会不停的创建销毁string对象,系统开销很大,使用StringBuilder效率更高。
abstract class与interface的区别还不太理解。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。