笔试题集一
1. 简述 private、protected、public、internal、protect internal 访问修饰符和访问权限
private:私有成员,只有在类内部才可以访问
public:公有成员,完全开放,没有访问限制
protected:保护成员,该类内部或其继承者可使用
internal:同一程序集内可以反问
protected internal:同一程序集或所有程序就该类的子类可以访问
2. 简述abstract、sealed类修饰符
abstract:指示一个类只能作为其他类的基类
sealed:指示一个类不能被继承
3. 简述C#成员修饰符
abstract:修饰类或者方法
⑴ 修饰类:使该类成为抽象类,该类不能生成对象的实例,但可以作为对象变量声明的类型,抽象类相当于一个半成品,需要子类继承并覆盖其中的抽象方法
⑵ 修饰方法:使该方法成为抽象方法,也就是只有声明没有实现,需要子类继承并实现(覆盖)
注:有抽象方法的类一定是抽象类,但抽象类不一定都是抽象方法,还可以有具体方法
virtual:指示一个方法或存储器的实现可以在继承类中被覆盖
const:指示一个变量只能在声明时被初始化,后续不能再修改
readonly:指示一个变量在构造函数中可以被初始化,但后续不能再修改
static: 指示一个成员属于该类本身,不属于特定的对象
event:声明一个事件
extern:指示方法在外部实现
override:实现基类
4. ADO.NET中的五个对象
Connection:启动程序与数据库的链接。
Conmmand:对数据库发出一系列的指令。
DataAdapter:数据源到 DataSet 之间执行数据传输工作。
DataSet:一个暂存区,可以保存数据库查询到的任意数据、结构等,是一个重量级的对象,架构在 DataAdappter上,本身不具备与数据源的沟通能力。
DataReader:一次一次的向下循环读取数据源中的数据,每次只读一条,性能好低负载。
5. ASP.NET 页面传值方式及优缺点
⑴ 通过URL的形式Get的方式传值,服务端通过QueryString获取 缺点:不太安全
⑵ Session 传值,简单易用但是会给服务器造成压力,因为这些数据都存在服务器上
⑶ Application 传值 作用于整个全局域,所有用户都可以看到,常用法 Lock 和 UnLock
⑷ Cookie 传值 存在客户端,靠每次请求头部带入,不安全,容易被伪造
⑸ Form表单(POST/GET)
⑹ <input type=hidden>
⑺ Server.Transfer
⑻ 数据库 安全,但性能一般
6. Server.Transfer 和 Response.Redirect 区别
前者服务器内部跳转,用户的浏览器不参与;后者浏览器参与,故地址栏会有变化
7. C#中的委托是什么?事件是不是一种委托?事件与委托的关系
委托是将一个方法通过传参的形式传入到另外一个函数中。事件是委托(这一点我表示怀疑,就好比说是属性是字段一样)。他两的联系呢?委托是一种类型,可以看做是对函数的抽象,是函数的“类”,委托的实例将代表一个具体的函数, 事件是将委托声明的对象进行封装的一个过程。就好比属性与字段的关系一样。
8. 重写(override)和重载(overload)的区别
override:是面向对象的概念,对基类的方法进行重写,并且必须保证方法签名与基类中一直
overload:是面向过程的概念,必须函数名相同,参数的个数或类型不同
9. 属性和 public 字段的区别是什么?通用set方法为一个属性赋值,然后用get方法读取出来的值一定是set进去的值吗
属性可以对设值、取值的过程进行控制,排除非法输入,字段不能;get取到的值不一定是set设值的,除非二者同时指向一个私有变量。
10. 三层架构
表现层(UI层 - User Interface)、业务逻辑层(BLL层 - Business Logic Layer)、数据访问层(DAL层 - Data Access Layer)
三层的思想其实是 “高内聚、低耦合” 的思想;但现在好多项目未必只有三层,还会有Core层、Cache层、甚至还有API层等
11. MVC 模式
MVC(Model View Controller)模型视图控制器
MVC是典型的各层之间平行关系,模型负责业务领域的事情,比如各种验证,视图负责显示的事情,控制器负责把数据取出来填充模型,再把模型交个视图去处理。MVC最大的好处是将UI层和BLL层的分离
12. 什么事装箱(boxing)和拆箱(unboxing)?如何避免?
装箱:值类型到引用类型
拆箱:引用类型到值类型
装箱比拆箱性能损耗大(使用泛型来避免,因为在你申明泛型的时候就需要给它指明类型)
object obj=null;
obj=1; //boxing
int i =int(obj); //unboxing
13. 什么事应用程序域(Application)
一种边界,可以理解为一个轻量级的进程,它起到一个应用程序中声明一个变量隔离与其他应用程序声明的变量,起到安全的作用。
14. 在dotnet中类(class)和结构(struct)的区别
相同点:
1. 二者都是container 类型,表示他们都可以包含其他类型作为成员
2. 二者都可以实现接口
3. 二者都可以声明和触发事件,都可以声明委托
不同点:
class 可以被实例化,属于引用类型,分配在内存的堆上。通过引用传递。
struct 属于值类型,分配在内存的栈上,通过赋值传递,不能申明析构函数,无法被继承,不需要构造函数。
15. 堆和栈的区别
存放在栈中的数据是有序的,保持着先进后出原则,它是一片连续的内存区域,由系统自动分配和维护,栈顶元素使用完毕后立马释放。
堆是无序的,它是一段不连续的内存域,由用户自己来控制和释放,如果用户自己不去释放的话,当内存达到某一特定值时,通过GC回收。
16. 能用foreach遍历访问的对象的要求
需要实现IEnumerable接口或声明GetEnumerator()方法的类型
17.GC是什么?为什么要有GC?
GC是垃圾回收器。用来管理托管堆上的资源,对于非托管的资源(比如 FileStream 或 SqlConnection)则不能被清除,需要程序员调用 Dispose() 进行资源回收
18. String s=new String("xyz");创建了几个String Object? vs上运行居然报错了
俩个对象;一个是 “xyz”,一个是指向“xyz”的对象
19. 值类型和引用类型的区别?
⑴ 存储位置:值类型存储在栈上而引用类型存储在托管堆上
⑵ 变量:值类型中的变量存储的是数据,而引用类型的变量存储的是指向数据的引用
⑶ 赋值:值类型赋值的过程中,是新建一块内存区域存新的变量;而引用类型的复制是,只复制数据的引用。
20. C# 接口和类有什么区别?
不同点:
⑴ 接口不能被实例化
⑵ 接口不能包含方法的实现(即:方法体)
⑶ 接口可以多继承,类只能单继承
相同点:
⑴ 都可被用来实现或继承的
⑵ 接口有点像抽象类
⑶ 接口和类都可以包含事件、方法、属性
21. abstract class 和 interface 有什么区别?
不同点:
⑴ 接口的中的方法不能有实现体,而抽象类可以
⑵ 一个类可以实现多个接口,但是只能继承一个抽象类
⑶ 接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持
⑷ 接口可以作用于类和结构体,而抽象类只能作用于类
相同点:
⑴ 都不能被实例化,但可以通过被继承或者被实现体现自己的价值
22. String 类是否可以被继承
String 类是 sealed 类,故不能被继承。

23. try{}里有一个return语句,那么紧跟在try后的finally{}里的Code会不会被执行,什么时候执行?
会在try模块内容结束后执行,如果有return,那么在return 之后执行
24. new 关键字的用法
new 运算符:用于创建对象和调用构造函数
new 修饰符:用于向基类成员隐藏继承成员
new 约束:用于在泛型声明中约束可能用作类型参数的类型
25. 如何把一个Array复制到ArrayList
实现1:
string[] s = { "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s);
实现2:
string[] s = { "111", "22222" }; ArrayList list = new ArrayList(s);
26. 描述线程和进程的区别
1. 线程和进程都定义了某种边界;进程定义的是应用程序之间的边界,不同的进程之间不能共享代码和数据空间。而线程定义的是代码执行堆栈和执行上下文的边界。
2. 一个进程可以包含若干个线程,同时创建多个线程来完成某项任务,这便是多线程。如果将进程比作一个家庭,那么线程就好比家庭中的每一个成员,以家庭为单位可以派出多个人五完成一项任务,家庭成员间可以共享财产,这里的财产就是内存资源或数据空间。
27. 什么是强类型,什么是弱类型,哪种更好?
举例子:
在C#中:int i=1; i="a";是不可以的
在JavaScript中:var i=1; i="a";是可以的
强类型是在编译时就必须确定的类型,在执行时类型不能被更改;而弱类型在执行时才会被确定
二者各有千秋,强类型安全,且效率高;弱类型灵活,单效率低,而且容易出错
强类型一般用于编译型语言,如:C# C++ Java 等,弱类型一般用于解释性语言 如:VB JavaScript
28. 什么是反射?
通过加载程序集及其中相应的模块,并且从程序集中查找某种类型并实例化它的过程。
29. int、DateTime、string 是否可以为null?
int 和DateTime不能,因为他们是值类型;string keyi1
30. string 是值类型还是引用类型
string 是引用类型,但是它通过上百个函数的包装,有了值类型的表现
31. 什么事CLR?
公共语言运行时/公共语言运行库,提供了内存管理(GC)、程序集加载、异常处理、线程同步等功能。凡是继续CLR的编程语言都可以使用这些功能。
32. 什么事应用程序域?
AppDomain ,是dotnet引入的一个概念,相当于一个轻量级的进程,它比进程所占资源少。一个应用程序可以包含多个应用程序域,一个应用程序域可以包含多个线程;应用程序域为Web应用程序提供了一个隔离空间,可以将各自应用程序域中创建的对象隔离。
33. 什么是托管代码和非托管代码?
非托管代码是直接运行在操作系统上的代码,托管代码顾名思义是需要某种平台一样的东西去委托管理他,dotnet中交由CLR管理的代码称为托管代码;Java中托管的平台是Java虚拟机,CLR[JIT编译器] 负责将托管代码转换成操作系统能执行的代码。
34. using关键字的作用?
① 引入命名空间,减轻代码量
② 给名字冲突的类起别名,这样就可以区分不同空间下的同名类
35. 什么事 IDisposable?
是为非托管资源类准备的接口,如果某个类使用了非托管资源,可以让该类继承这个接口,这是 .Net非托管资源的标准实现。IDisposable 有一个Dispose方法,实现这个方法来销毁要销毁的资源。
36. String 和 StringBuilder 和 StringBuffer 的区别?
String [字符串常量] 是一个不可变的字符串,我们经常用到的对字符串的操作,看似动态修改变量的值,实则并不是在原String对象上执行,而是重新定义了一个字符串变量赋值然后回收掉旧的变量,所以String不适合大规模字符串操作。
StringBuilder [字符串变量] 类似一个特殊的构造器,包含一个字段,该字段应用了一个数组,当我们操作这个数组时如果越过了其最大长度,StringBuilder 会分配一个更大的数组来装,同时销毁前一个数组。线程非安全
StringBuffer [字符串变量] 线程安全
总结:操作少量的字符串 用 String
单线程下操作大量的字符串 用 StringBuilder
多线程下操作大量字符串 用 StringBuffer
37. 抽象函数和虚函数各有什么特点 ?
都用来被子类重写,对于抽象函数,子类没有选择权,必须重写;而对于虚函数,子类可以选择不去重写。
虚函数可以定义在普通类里,也可以定义在抽象类里;而抽象函数只能定义在抽象类中
38. C# 中 is 和 as 运算符的作用?
is :检查对象的真实类型是否与给定类型兼容,兼容返回 true ,不兼容返回 false ;但不能用于用户自定义的类型
as:把对象转换为给定的引用类型,能则返回引用,不能则返回 null ;但不能用于值类型上。
39. short s1=1; s1=s1+1 有什么错?short s1=1; s1+=1;
前者有错,s1+1 由 short 型隐式转换为 int ,s1= 不能再显示转换为 short了,但是可以改为 s1=(short)(s1+1);后者正确,+=貌似自带显式转换。
40. 面向对象的语言的两大实现?三大特性?六大规则?
两大实现:抽象、接口
三大特性:封装、继承、多态
六大规则:
⑴ 单一职责原则 SRP(Single Responsebility Principle):一个类的功能要单一,不能包罗万象
⑵ 开放封闭原则 OCP(Open-Close Principle):一个类对扩展开放,对修改封闭
⑶ 替换原则 LSP(The Liskov Substitution Principle):父类出现的地方,子类完全可以出现,并可以很好的胜任
⑷ 依赖倒置原则 DIP(The Dependency Inversion Principle):具体依赖抽象,上层依赖下层;如B是交A低的模块,但当B要使用A中的功能时,B不能直接使用A中的类,而是定义一个抽象接口,A来实现这个接口,B只使用这个抽象接口。
⑸ 接口分离原则 ISP(The Interface Segregation Principle):模块间要通过抽象接口隔离开,而不是通过具体类强耦合起来
⑹ 最少知道原则/迪米特法则 LKP(The Least Knowledge Principle):一个对象对其他对象尽可能少了解,不和陌生人说话。
41. 软件开发一般有几个阶段?每个阶段的作用?
需求分析,架构设计,代码编写,QA,部署
42. 页面生命周期概述?
页请求,开始,页初始化,加载,验证,回发事件处理,呈现,卸载
43. Session 存在什么重大问题?微软提出了什么方法加以解决?
iis由于有进程回收机制,当系统繁忙的话,Session容易被GC垃圾回收机制回收掉,造成Session丢失。解决办法:数据库存储。
44. HttpHandle 和 HttpModul有何区别?什么情况下使用 Handle 什么情况下使用 Modul?
HttpHandle:用于响应一类资源的请求,为一类请求生成响应结果
HttpModule:默认进入ASP.NET的所有请求做处理,如果要处理部分请求,那么自行判断
45. 一列数的规则如下:1、1、2、3、5、8、13、21、34、…求第30位数是多少?用递归算法实现
public static int GetFibonacciSequence(int index) { if (index <= 2) return 1; return GetFibonacciSequence(index-1) + GetFibonacciSequence(index-2); }
46. 请编程实现一个冒泡算法
public static int[] BubbleSort(int[] array) { if (null == array || array.Length == 0) return array; for (int i = 0; i < array.Length; i++) { for (int j = 0; j < array.Length-i-1; j++) { if (array[j]>array[j+1]) { int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } } } return array; }
47. 用dotnet做B/S结构的系统,你是用几层结构来开发,每一层之间的关系,以及为什么这样分层。
一般小项目:
UI层(表现层,用WebForm或者MVC实现)、Biz层(业务逻辑和数据请求混合) 两层
中小型项目:
UI层(表现层)、Biz层(业务逻辑层)、Da层(数据处理层 Ado.net 或者 EF、Dapper等ORM框架) 三层
大型项目:
UI层(表现层)、Biz层(业务处理层)、Interface层(接口层)、Cache层(缓存层)、Core层(核心层)、Data层(数据处理层 Ado.net 或者 EF、Dapper等ORM框架) N层
层次越多,好处是项目逻辑清晰、性能优越、容易扩展;缺点是代码量大,开发慢。
48. 下面的例子执行结果是?
public static void Main(string[] args) { B b = new B(); b.PrintFields("B"); } class A { public A() { PrintFields("A"); } public virtual void PrintFields(string name){} } class B : A { int x = 1; int y; public B() { y = -1; } public override void PrintFields(string name) { Console.WriteLine("{2}调用的 x={0},y={1}", x, y,name); } }
答:x=1,y=0
x=1,y=-1

原因:一个类中如果没有显示的调用超类的构造方法,则在执行子类的构造方法之前会首先调用父类的构造方法,构造函数中调用的方法其实是子类的方法。
49. 在 C# 中,string str=null 与 string str="" 有什么区别?
前者没有给他分配内存空间,而后者为他分配了长度为空字符串的空间。
50. 请分下下面代码,完成天空
string strTimp="abcdefg某某某"; int i=System.Text.Encoding.Default.GetBytes(strTemp).Length; int j=strTemp.Length;
以上代码执行结果i,j分别为?
13,10
真正的大师永远怀着一颗学徒的心。

浙公网安备 33010602011771号