C#基础知识
最近在求职(现在已经找到工作,但是遇到一些不太熟悉容易忽略的基础知识仍会持续更新),求职免不了面试,面试则免不了对基础知识的提问,而我学习的时候却是从直接上手敲代码开始,基础知识可以说是很薄弱,很多地方知其然不知其所以然,最近只好苦学基础知识,俗话说:好记性不如烂笔头,这里将我学到的东西记录一下,方便日后复习使用,如果能帮助别人的话那是最好了。废话不多说,开始。。。。。。。。。。。。
1、static
static变量有的人说只赋值一次,我觉得不是,static变量可以多次赋值,但是以最后一次赋值为准,并且变量用完后不会消失,直至整个程序退出。例如一个网页,定义了一个static变量,在不同的button事件中可以任意赋值,但是变量存储的永远是最后一次赋的值。如果不重复赋值,那么怎么刷新页面,变量仍然为原来的值,直至服务器关闭。在C#里面还有static构造函数,这样的构造函数只在第一个实例创建的时候执行,之后不会再执行。
而static方法的话就是方法属于类而不是数据类的对象,无需实例化类可直接使用static方法。
2、const与readonly区别
1)const和readonly变量的值一旦初始化都不能再更改
2)const变量只能在声明的时候初始化,而readonly变量可以在构造函数里面进行初始化
3)const常量默认是static的,而readonly则不默认,若要设为static类型,则要显示的声明(如:static readonly int a)
4)const是编译期静态解析的常量,readonly则是编译期动态解析的常量
5)const既可以修饰类中的成员,又可以修饰函数体内的局部变量,而readonly只可以用来修饰类中的成员
3、结构体和类
以前一直不知道像int、bool这些就是结构体,真是汗颜啊,结构体和类有相似的地方,也有不同的地方
相同的地方:
(1)结构体和类都可以继承借口
(2)结构体和类都可以声明字段、方法、构造函数,只是结构体的构造函数必须有参数,结构体有默认的构造函数,并且不能被重写
不同的地方:
(1)结构体有默认的构造函数,可以自己写构造函数,但是必须带有参数,而类可以写无参数的构造函数,很多人都说结构体不能用new初始化,大多都是互相抄袭吧,自己不试就写出来很不负责任的,结构体不管有没有定义含参数的构造函数都可以用new实例化的。
(2)结构体不能继承结构体,而类可以继承或被继承
(3)结构体是值类型,而类是应用类型,对应的存在的位置也会不同,结构体存放在内存栈中,而类存在内存堆中
4、接口和抽象类
其实我个人觉得接口更像是抽象类的升级版,更加抽象了,比抽象类更抽象:)
相同的地方:
(1)接口和抽象类均无法实例化,只能被继承
(2)抽象类和接口均可用实现其的子类替代,即将抽象类或接口指向其子类,前提是子类完全实现了继承的抽象类或接口
(3)继承他们的子类据需要完全实现他们声明的方法才能实例化(对于抽象类已经实现的方法并不是必需要重写)
不同的地方:
(1)一个类可以继承多个接口,但只能继承一个抽象类
(2)抽象类可以给出方法的实现,但是接口不可以,只能声明方法存在留给继承的子类实现
(3)接口里的方法或变量必需是全部公开的,因为私有的没意义,而抽象类里可以有私有变量和方法
5、string s="";和string s=string.Empty;
二者并没有什么区别,调试时可发现string.Empty其实也是"",所以这两个其实是一样的。
6、string和String
可以这样理解,string是String的外号,两者在绝大部分情况下是一样的,只有一点不同,stirng无法做变量名而String可以。两者到底有啥区别?
string是C#语言中的保留关键字,表示字符串类型。而String是.Net中的一个类,在CLR中并没有string这个说法,只有String类,C#代码在编译后string均被当成String处理。int和int32亦是同样的道理。
7、new
new用的最多的是新建对象或结构实例,但在c#中new关键字还有另外两个作用,不经常用到,但也应知道,该知识点进入我视野起源于面试题,勾起回忆与CLR via C#,园子里已经有朋友特意写过关于这个知识点的文章(传送门:http://www.cnblogs.com/kingdom_0/articles/2023499.html),看了这位朋友的文章后自己思考了下,这里加上一点我自己的补充:
(1)new在用于隐藏成员时并不是必需的,当在子类中重新定义成员时就隐式的隐藏了父类中的成员,若不用new编译器会给出警告但是并不会报错
(2)new用于隐藏基类中的成员时,只对基类中非私有的成员起作用(比如基类中有private int x=1;,子类中写new private int x=2;并不会起到隐藏基类x的作用)
(3)若基类中有字段A和方法B,方法B用到了字段A,子类中只有A和B同时被隐藏这样子类调用B方法时用到的才是子类中的重新定义的字段A,否则,若方法B在子类中并未被隐藏,那么调用子类中的方法B时使用的仍然是基类中的字段A
(4)子类中被隐藏的成员与基类完全独立,类型神马的都可以改变,可见性当然也不在话下(这点与new无关,但是觉得挺重要,一并写了)