来源:《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效率更高