0. 参考文档
1. .NET和C#有什么区别?
.NET一般指 .NET FrameWork框架,它是一种平台,一种技术
C#是一种编程语言,可以开发基于.NET平台的应用
2. ASP.NET和ASP有什么区别?
ASP.NET的脚本是与HTML分离的,代码被编译成了DLL,DLL可以在server端执行
ASP的脚本是与HTML在一起的,每次都会进行解释执行
3. string str=null和string str=""和string str=string.Empty的区别?
string.Empty相当于"",Empty是一个静态只读的字段
string str="" 初始化对象,并分配一个空字符串的内存空间,string str=null 初始化对象,不会分配内存空间
4. byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 这些变量有些错误是错再哪里?
1byte =8bit,1个汉字=2个byte,1个英文=1个byte=8bit
所以bc是对的,deg是错的。'a'是char类型,a错误,java byte取值范围是-128~127, 而C#里一个byte是0~255
5. string和StringBuilder的区别,两者性能的比较
相同点:都是引用类型,分配在堆上
不同点:string 对象时恒定不变的,stringBuider 对象表示的字符串是可变的
stringBuilder 是.net 提供的动态创建 string 的高效方式,以克服 string 对象恒定性带来的性能影响
对于简单的字符串连接操作,在性能上 stringBuilder 并不一定总是优于 string。因为 stringBuider 对象创建代价较大,在字符串目标连接较少的情况下,过度滥用 stringBuilder 会导致性能的浪费,只有大量的或者无法预知次数的字符串操作,才考虑 stringBuilder 来实现
事实上,一般连接次数设置 100 次以内,根本看不出两者的性能差别
6. 什么是扩展方法?
一句话解释,扩展方法使你能够向现有类型“添加”方法,无需修改类型
条件:1.必须要静态类中的静态方法,2.第一个参数的类型是要扩展的类型,并且需要添加this关键字
建议:通常,只在不得已的情况下才实现扩展方法,并谨慎的实现
使用:不能通过类名调用,直接使用类型来调用
7. byte a =255;a+=5;a的值是多少?
byte的取值范围是-2的8次方至2的8次方-1,-256至255,a+=1时,a的值时0,a+=5时,a的值是4
8. 什么是装箱和拆箱?
装箱就是隐式地将一个值类型转换成引用类型,如:
int i=0;
Syste.Object obj=i;
拆箱就是将引用类型转换成值类型,如:
int i=0;
System.Object obj=i;
int j=(int)obj;(将obj拆箱)
装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个全新的对象。内存拷贝,从引用类型转换成值类型,需要从堆拷贝到栈!处理器处理的事情多了,自然引发性能问题
9. 说说 123+”” 和 123.Tostring() 的区别
123+”” 由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中
使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能
10. C#中,运算符“?”和“??”的区别是什么?
int? x = null;//定义可空类型变量
i=3?2:5 //还可为三元运算符
int? y = x ?? 1000;//使用合并运算符,当变量x为null时,预设赋值1000
11. 值类型和引用类型的区别
值类型变量是直接包含值。将一个值类型变量赋给另一个值类型变量,是复制包含的值,默认值是0
引用类型变量的赋值只复制对对象的引用,而不复制对象本身,默认值是null
值类型存储在栈中,引用类型存储在堆中
12. 栈和堆的区别
比如:程序内存分区中的堆与栈,另外一种是数据结构中的
栈由操作系统自动分配释放,无需手动控制;堆的申请和释放工作手动控制,容易产生内存泄漏
堆:是无序的,是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收
栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC清理
13. new关键字的作用?
运算符:创建对象实例,默认调用无参构造函数
修饰符:在派生类定义一个重名的方法,隐藏掉基类方法
约束:泛型约束定义,约束可使用的泛型类型,如
14. int?和int有什么区别?
int?为可空类型,默认值可以是null
int默认值是0
int?是通过int装箱为引用类型实现
15. C#中的委托是什么?
一句话解释就是:将方法当作参数传入另一个方法的参数,本质是一个类
作用:提高方法的扩展性
.net中有很多常见的委托如:Func 、Action
16. 简述Func与Action的区别?
Func是有返回值的委托,Action是没有返回值的委托
17. 用最有效的方法算出2乘以8等于几?
位运算是最快,使用的是位运算(逻辑左位移<<)
方法是2<<3相当于0000 0000 0000 0010 (2的16位int二进制)左移三位就是 0000 0000 0001 0000(16的二进制)
18. const和readonly有什么区别?
都可以标识一个常量。主要有以下区别:
- 初始化位置不同。const必须在声明的同时赋值;readonly即可以在声明处赋值,也可以在静态构造方法(必须是静态构造方法,普通构造方法不行)里赋值
- 修饰对象不同。const即可以修饰类的字段,也可以修饰局部变量;readonly只能修饰类的字段
- const是编译时常量,在编译时确定该值;readonly是运行时常量,在运行时确定该值
19. 判断一个整数是否是2的N次方
取模运算: 用number%2==0可以判断,但是这个有点低级
位运算:(使用位运算逻辑并,两个位上的都为1才是1,其余都是0,判断是否等于0)
20. CTS、CLS、CLR分别作何解释
CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库
CTS:Common Type System 通用类型系统。Int32、Int16→int、String→string、Boolean→bool。每种语言都定义了自己的类型,.Net通过CTS提供了公共的类型,然后翻译生成对应的.Net类型
CLS:Common Language Specification 通用语言规范。不同语言语法的不同。每种语言都有自己的语法,.Net通过CLS提供了公共的语法,然后不同语言翻译生成对应的.Net语法
CLR:Common Language Runtime 公共语言运行时,就是GC、JIT等这些。有不同的CLR,比如服务器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相当于一个发动机,负责执行IL
21. 在.net中,配件的意思是?
程序集(中间语言,源数据,资源,装配清单)
22. Strings = new String(“xyz”);创建了几个 String 对象?
两个对象,一个是“xyz”,一个是指向“xyz”的引用对象 s
23. 静态成员和非静态成员的区别
- 静态成员用statis修饰符声明,在类被实例化时创建,通过类进行访问
- 不带statis的变量时非静态变量,在对象被实例化时创建,通过对象进行访问
- 静态方法里不能使用非静态成员,非静态方法可以使用静态成员
- 静态成员属于类,而不属于对象
24. 什么是受管制的代码?
unsafe:非托管代码,不经过CLR运行
25. c#可否对内存直接操作?
C#在unsafe 模式下可以使用指针对内存进行操作, 但在托管模式下不可以使用指针,C#NET默认不运行带指针的,需要设置下,选择项目右键->属性->选择生成->“允许不安全代码”打勾->保存
26. short s1 = 1; s1 = s1 + 1;有什么错?
s1+1不能隐式转换成short类型,可以修改为s1 =(short)(s1 + 1)
27. 什么是强类型,什么是弱类型?哪种更好些?为什么?
强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型
二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高
28. using关键字的作用
引用命名空间,也可using 别名
释放资源,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源
29. ref 和 out 有什么区别
都是按引用类型进行传递,属性不是变量不能作为out、ref参数传递
- ref参数在传入方法之前必须进行初始化;而out参数在传入方法之前可以不用初始化
- ref参数在方法内部可以直接使用;而out参数在方法内部不能直接使用
- ref参数在方法内部可以使用也可以不使用;而out参数在方法返回之前必须对其赋值
30. a.Equals(b)和a==b一样吗?
不一样,a==b仅仅表示a和b值相等,a.Equals(b)表示a与b一致
31. Math.Round(11.5)等于多少? Math.Round(-11.5)等于多少?
Math.Round(11.5)=12,Math.Round(-11.5)=-12
33. i++和++i有什么区别?
i++是先赋值,然后再自增;++i是先自增,后赋值
34. as和is的区别
as在转换的同时判断兼容性,如果无法进行转换,返回位null(没有产生新的对象)
is只是做类型兼容性判断,并不执行真正的类型转换,返回true或false,对象为null也会返回false
as比is效率更高,as只需要做一次类型兼容检查
35. .net Remoting 的工作原理是什么?
服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置