上个月离职了, 这几天整理了一些常见的面试题, 整理成一个系列给大家分享一下, 机会是给有准备的人, 面试造火箭, 工作拧螺丝, 不慌, 共勉.
1.NET 必问的面试题系列之基本概念和语法
2.NET 必问的面试题系列之面向对象
3.NET 必问的面试题系列之设计模式
4.NET 必问的面试题系列之集合, 异常, 泛型
5.NET 必问的面试题系列之简单算法
6.NET 必问的面试题系列之数据库
7.NET 必问的面试题系列之 web 前端
1. 字符串中 string str=null 和 string str="" 的区别
string str="" , 初始化对象, 并分配一个空字符串的内存空间
string str=null, 初始化对象, 不会分配内存空间
2. byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 这些变量有些错误是错再哪里?
a 本题考查的是数据类型能承载数据的大小.
b 1byte =8bit,1 个汉字 = 2 个 byte,1 个英文 = 1 个 byte=8bit
c 所以 bc 是对的, deg 是错的.'a'是 char 类型, a 错误
d java byte 取值范围是 - 128~127, 而 C# 里一个 byte 是 0~255
3.string 和 StringBuilder 的区别, 两者性能的比较
a 都是引用类型, 分配再堆上
b StringBuilder 默认容量是 16, 可以允许扩充它所封装的字符串中字符的数量. 每个 StringBuffer 对象都有一定的缓冲区容量, 当字符串大小没有超过容量时, 不会分配新的容量, 当字符串大小超过容量时, 会自动增加容量.
c 对于简单的字符串连接操作, 在性能上 stringbuilder 不一定总是优于 string. 因为 stringbulider 对象的创建也消耗大量的性能, 在字符串连接比较少的情况下, 过度滥用 stringbuilder 会导致性能的浪费而非节约, 只有大量无法预知次数的字符串操作才考虑 stringbuilder 的使用. 从最后分析可以看出如果是相对较少的字符串拼接根本看不出太大差别.
d Stringbulider 的使用, 最好制定合适的容量值, 否则优于默认值容量不足而频繁的进行内存分配操作, 是不妥的实现方法.
参考链接: https://www.cnblogs.com/haofuqi/p/4826262.html
4. 什么是扩展方法?
a 一句话解释, 扩展方法使你能够向现有类型 "添加" 方法, 无需修改类型
b 条件: 按扩展方法必须满足的条件, 1. 必须要静态类中的静态方法 2. 第一个参数的类型是要扩展的类型, 并且需要添加 this 关键字以标识其为扩展方法
c 建议: 通常, 只在不得已的情况下才实现扩展方法, 并谨慎的实现
d 使用: 不能通过类名调用, 直接使用类型来调用
5.byte a =255;a+=5;a 的值是多少?
byte 的取值范围是 - 2 的 8 次方至 2 的 8 次方 - 1,-256 至 258,a+=1 时, a 的值时 0,a+=5 时, a 的值是 0, 所以 a+=5 时, 值是 4
6. 什么是装箱和拆箱?
装箱就是隐式地将一个值类型转换成引用类型, 如:
- int i=0;
- Syste.Object obj=i;
拆箱就是将引用类型转换成值类型, 如:
- int i=0;
- System.Object obj=i;
- int j=(int)obj;(将 obj 拆箱)
7. 值类型和引用类型的区别
值类型变量是直接包含值. 将一个值类型变量赋给另一个值类型变量, 是复制包含的值, 默认值是 0. 引用类型变量的赋值只复制对对象的引用, 而不复制对象本身, 默认值是 null
值类型有整形, 浮点型, bool, 枚举. 引用类型有 class,delegate,Object,string
值类型存储在栈中, 引用了类型存储在堆中
8.new 关键字的作用
运算符: 创建对象实例
修饰符: 在派生类定义一个重名的方法, 隐藏掉基类方法
约束: 泛型约束定义, 约束可使用的泛型类型
- public class ItemFactorywhere T : IComparable, new()
- {
- }
9. int? 和 int 有什么区别
int? 为可空类型, 默认值可以是 null,int 默认值是 0,int? 是通过 int 装箱为引用类型实现
10. C# 中的委托是什么?
一句话解释就是: 将方法当作参数传入另一个方法的参数.
.net 中有很多常见的委托如: Func ,Action
作用: 提高方法的扩展性
11. 用最有效的方法算出 2 乘以 8 等于几?
位运算是最快, 使用的是位运算 逻辑左位移<<.
方法是 2<<3 相当于 0000 0000 0000 0010 (2 的 16 位 int 二进制)左移三位就是 0000 0000 0001 0000(16 的二进制)
相关参考链接: https://www.cnblogs.com/zhangmumu/p/10781201.html
12.const 和 readonly 有什么区别?
都可以标识一个常量. 主要有以下区别:
1, 初始化位置不同. const 必须在声明的同时赋值; readonly 即可以在声明处赋值, 也可以在静态构造方法 (必须是静态构造方法, 普通构造方法不行) 里赋值.
2, 修饰对象不同. const 即可以修饰类的字段, 也可以修饰局部变量; readonly 只能修饰类的字段
3,const 是编译时常量, 在编译时确定该值; readonly 是运行时常量, 在运行时确定该值.
4,const 默认是静态的; 而 readonly 如果设置成静态需要显示声明
5, 修饰引用类型时不同, const 只能修饰 string 或值为 null 的其他引用类型; readonly 可以是任何类型.
13. 现有一个整数 number, 请写一个方法判断这个整数是否是 2 的 N 次方
4(100),5(101),8(1000),16(10000)
取模运算:
用 number%2==0 可以判断, 但是这个有点低级
位运算:(使用位运算逻辑并, 两个位上的都为 1 才是 1, 其余都是 0, 判断是否等于 0)
4&3 相当于 100&011 , 结果是 000 等于 0, 所以 4 是 2 的 n 次方
5&4 相当于 101&100, 结果是 100 不等于 0, 所以 5 不是 2 的 n 次方
如果要问如果是 2 的 N 次方, 这个 N 是多少? 这该怎么算?
- private static byte get(int n)
- {
- byte number = 1;
- while (n/2!=1)
- {
- n = n / 2;
- number += 1;
- }
- return number;
- }
14.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.
15. 在. net 中, 配件的意思是?
程序集.(中间语言, 源数据, 资源, 装配清单)
16. 分析下面代码, a,b 的值是多少?
- string strTmp = "a1 某某某";
- int a = System.Text.Encoding.Default.GetBytes(strTmp).Length;
- int b = strTmp.Length;
分析: 一个字母, 数字占一个 byte, 一个中文占占两个 byte, 所以 a=8,b=5
17.Strings = new String("xyz"); 创建了几个 String Object?
两个对象, 一个是 "xyz", 一个是指向 "xyz" 的引用对象 s.
18. 能用 foreach 遍历访问的对象需要实现 ______接口或声明______方法的类型.
IEnumerable , GetEnumerator
19. 静态成员和非静态成员的区别
1. 静态成员用 statis 修饰符声明, 在类被实例化时创建, 通过类进行访问
2. 不带 statis 的变量时非静态变量, 在对象被实例化时创建, 通过对象进行访问,
3. 静态方法里不能使用非静态成员, 非静态方法可以使用静态成员
4. 静态成员属于类, 而不属于对象
- 20.c# 可否对内存直接操作
- C# 在 unsafe 模式下可以使用指针对内存进行操作, 但在托管模式下不可以使用指针, C.NET 默认不运行带指针的, 需要设置下, 选择项目右键 ->属性 ->选择生成 ->"允许不安全代码" 打勾 ->保存
21.short s1 = 1; s1 = s1 + 1; 有什么错? short s1 = 1; s1 += 1; 有什么错?
s1+1 不能显式转换成 short 类型, 可以修改为 s1 =(short)(s1 + 1) .short s1 = 1; s1 += 1 正确
22. 什么是强类型, 什么是弱类型? 哪种更好些? 为什么?
强类型是在编译的时候就确定类型的数据, 在执行时类型不能更改, 而弱类型在执行的时候才会确定类型. 没有好不好, 二者各有好处, 强类型安全, 因为它事先已经确定好了, 而且效率高. 一般用于编译型编程语言, 如 c++,java,c#,pascal 等, 弱类型相比而言不安全, 在运行的时候容易出现错误, 但它灵活, 多用于解释型编程语言, 如 JavaScript,vb,PHP 等
23.using 关键字的作用
1. 引用命名空间
2. 释放资源, 实现了 IDisposiable 的类在 using 中创建, using 结束后会自定调用该对象的 Dispose 方法, 释放资源.
24.ref 和 out 有什么区别
1. 都是按引用类型进行传递
2. 属性不是变量不能作为 out,ref 参数传递
3.ref 参数必须初始化. out 不需要初始化
4. 作用, 当方法有多个返回值时, out 非常有用
25.a.Equals(b)和 a==b 一样吗?
不一样, a==b 仅仅表示 a 和 b 值相等, a.Equals(b)表示 a 与 b 一致
26. 下面这段代码求值
- class Class1
- {
- internal static int count = 0;
- static Class1()
- {
- count++;
- }
- public Class1()
- {
- count++;
- }
- }
- Class1 o1 = new Class1();
- Class1 o2 = new Class1();
o1.count 的值是多少?
答案: 3, 静态 构造方法计算一次, 两个实例化对象计算两次.
27. 关于构造函数说法正确的是哪个?
a)构造函数可以声明返回类型.
b)构造函数不可以用 private 修饰
c)构造函数必须与类名相同
d)构造函数不能带参数
答案: c , 构造函数必须与类名相同, 可以传递多个传递, 作用就是便于初始化对象成员, 不能有任何返回类型
28.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
c# 里面都是 12
29.& 和 && 的区别
& 是位运算逻辑与运算符, 如 true&true 结果是 true,0&0 结果是 0,2&3 的结果是(10&11=10)2
&& 是与运算符, 两个都为 true 才是 true
参考链接 https://www.cnblogs.com/zhangmumu/p/10781201.html
30. i++ 和 ++i 有什么区别?
1.i++ 是先赋值, 然后再自增;++i 是先自增, 后赋值.
2.i=0,i++=0,++i=1; Console.WriteLine(++i==i++); 结果位 true
31.float f = 3.4; 是否正确?
不正确,.3.4 是 double 类型双精度的, double 向下转型 float 会造成精度缺失(类似于 long 转 int), 因此需要强制转换, float f =3.4F 或者 float f =(float)3.4
32. 什么是自动转换, 什么是强制转换, 什么时候需要自动转换, 什么时候需要强制转换
1. 自动类型转换: 编译器自动完成类型转换, 不需要在程序中编写代码.
2. 强制类型转换: 强制编译器进行类型转换, 必须在程序中编写代码
3. 转换规则: 从存储范围小的类型到存储范围大的类型, 是自动转换, 如 byte=>short=>int=>long
来源: https://www.cnblogs.com/zhangmumu/p/11406751.html