C#.NET面试题汇总系列一:基础语法

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 的工作原理是什么?

服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置

36. 深拷贝和浅拷贝区别

深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用

posted @ 2022-03-01 13:20  位永光  阅读(617)  评论(0编辑  收藏  举报