C#面试题汇总(一)基础语法

来源:《dotNET跨平台》 微信公众号,十分感谢。

问题: 

  • 1. 字符串中string str=null和string str=""和string str=string.Empty的区别

  • 2. byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 这些变量有些错误是错再哪里?

  • 3. string和StringBuilder的区别,两者性能的比较

  • 4.什么是扩展方法?

  • 5. byte a =255;a+=5;a的值是多少?

  • 6. 什么是装箱和拆箱?

  • 7. 值类型和引用类型的区别?

  • 8. new关键字的作用

  • 9. int?和int有什么区别?

  • 10. C#中的委托是什么?

  • 11. 用最有效的方法算出2乘以8等于几?

  • 12. const和readonly有什么区别?

  • 13. 现有一个整数number,请写一个方法判断这个整数是否是2的N次

  • 14. CTS、CLS、CLR分别作何解释

  • 15. 在.net中,配件的意思是?

  • 16. 分析下面代码,a、b的值是多少?

  • 17. String s = new String(“xyz”);创建了几个String Object?

  • 18. 静态成员和非静态成员的区别

  • 19. c#可否对内存直接操作

  • 20. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

  • 21. 什么是强类型,什么是弱类型?哪种更好些?为什么?

  • 22. using关键字的作用

  • 23. ref和out有什么区别

  • 24. a.Equals(b)和a==b一样吗?

  • 25. 下面这段代码求值

  • 26. 关于构造函数说法正确的是哪个?

  • 27. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

  • 28. &和&&的区别?

  • 29. i++和++i有什么区别?

  • 30. as和is的区别?

参考答案:

 1.string str = null ,只初始化了对象,但是并不分配空间;.Empty和""相同,既初始化对象,又分配了一个空字符串的空间。

2.Java的byte是-128~127,C#的byte是0~255,因而只有c是对的,char不能自动转换为byte

3.二者都是引用类型,都存储在堆上。每一次使用system.string类型,都会在堆中为之分配内存,当涉及到大量的字符串拼接等操作时,内存消耗很大。system.text.stringbuilder类可以为字符串分配内存当内存空间不足时翻倍为其增加内存,在使用时最好确定制定合适的容量,否则频繁的进行扩容等操作一样性能不高。

4.扩展方法是在不改变源码的基础上,为一个类增加方法的方式。写扩展方法之前先写一个静态扩展类,然后在该类中写静态扩展方法,扩展方法的第一个参数必须是this后接要扩展的类,随后可以用逗号接其他参数。使用时直接通过类型的实例来调用。

5.255+1在byte中回到0了,于是结果为4.

6.装箱就是隐式的将一个值类型转换为引用类型(int转obj);拆箱就是引用类型转换为值类型(obj转int)。

7.

a.值类型变量是直接包含值,将一个值类型变量赋值给另一个值类型变量,是复制包含的值,默认值是0

b.引用类型变量的赋值只是复制了对象的引用,而不是对象本身,默认为null

c.值类型有整形、浮点型、bool、enum、struct

d.引用类型有class、delegate、object、string

e.值类型存储在栈上,引用类型存储在堆上

8.

a.创建对象的实例

b.在派生类中定义一个重名的方法,用new来屏蔽基类

c.泛型约束,要求泛型有构造函数

9.int?表示可以为null也可以为0,int默认只能为0;int?是通过int装箱实现的。顺便说一下??操作符,表示如果为null则赋值为后的值,该结果输出为字符串a:

10.委托就是函数指针;将方法当做参数传入另一个方法中。.net中有默认的委托,如Func和Action,注意,Func和Action都是泛型委托类型,其中Func带有一个返回值(最后一个参数),Action没有返回值。

11.位运算最快,2乘以8等同于2<<3

12.const声明一个变量就表明该变量是一个明确且固定的值,如const int a = 1+2;显然在编译之前,无法确定a的值,所以写法错误,我们一般使用const就说明这是一个静态不变的常量,这是在编译之前就可以确定的。然后readonly表示的常量是在运行时通过构造函数确定的,默认情况下,它不是类的常量,是属于实例的常量,在不同的构造方法中,readonly中的常量可能不同。

13.取模,与相邻的数作逻辑与运算为0则是2的倍数

14.CTS:通用类型系统,CLS:通用语言规范,CLR:公共语言运行时

CLR:就是GC、JIT等这些内容,有不同的CLR,比如服务器CLR、Linux CLR(Mono)、SilverlightCLR(CoreCLR)。相当于一个发动机,负责执行IL。(可以参考我之前记录的一个博文)

15.在.net中,配件的意思是程序集(中间语言,源数据,资源,装配清单)

16.a=8,b=5

17.两个对象,一个是“xyz”,一个指向“xyz”的引用对象s

18.静态成员使用static修饰声明,在类被实例化时创建,通过类进行访问,不带static的变量是非静态变量,在对象实例化时创建,通过实例访问,静态方法里不能使用非静态变量,但是非静态方法里可以使用静态变量,静态成员属于类不属于实例。

19.C#在unsafe模式下可以使用指针对内存进行操作,但是在托管模式下不可以使用指针,C#NET默认不运行带指针的,需要手动设置,选择项目右键->属性->选择生成->“允许不安全代码”->保存

20.在C#中数字默认是int类型,因而s1+1是int型,需要强制转换 s1 = (short)(s1+1);第二个是对的

21.强类型是在编译的时候就确定类型的数据,在执行时不能更改,而弱类型在执行的时候才会确定其类型,强类型更安全高效,弱类型更灵活。强类型一般用于编译型语言,例如C++、C#、Java、pascal等,弱类型多用于解释性语言,例如javascript、vb、php等

22.引入命名空间;释放资源,实现了IDisposiable的类在using中创建、using结束后会自动调用该对象的Dispose方法,释放资源

23、ref和out都是引用参数传递的关键字,对应的参数都是按照引用类型进行传递,ref参数必须初始化,out参数可以不用初始化。

24.

1. 对于值类型,==和Equals()等价,都是比较存储信息的内容(即比较两个对象的值是否相同);

2. 对于除string之外的引用类型,==比较的是栈的内容是否相同(即是否指向同一个堆中地址),Equals()判断是否对同一个对象的引用(即堆中的内容是否相同);

3. string是一种特殊的引用类型,在C#语言中,重载了Object对象的很多方法(包括equals()方法),使string对象用起来就像是值类型一样

25.静态构造方法只执行一次,实例构造方法执行两次。(第一次声明函数时,静态构造函数就会执行了)

26. 构造函数必须与类同名,可以传递多个参数,作用是便于初始化对象成员,不能有任何返回类型。

27.12,-12 ; 并不是四舍五入,可以采用其中一个重载decimal Round(decimal d, int decimals, MidpointRounding mode)完成四舍五入。例如:            Console.WriteLine(Math.Round((decimal)525.95, 1, MidpointRounding.AwayFromZero));

28.&&相比&具有短路功能,更高效安全一些;如果作用于int型,则&&无意义,&是位运算符,相同为1不同为0

29.先后问题

30.as可以转换类型,同时还有兼容性判断,若不能转换则为null,因而判断as是否转换成功就可以通过转换后结果是否为null来判断;is只是做兼容性判断,并不执行真正的转换,返回true或者false,对象为null也会返回false。由此可以看出as效率更高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值