代码改变世界

我的2015年C# 面试常见问题

2015-08-08 18:38  一叶之秋愁上头  阅读(236)  评论(0)    收藏  举报

近期面试过好几家公司,面试总有一些自己没有弄明白的地方。所有自已整理了一下。也算做一个笔记。不足之处请指正。

 

(一)   值类型与引用类型

数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型决定了对象在内存中存储的位置—栈或堆

值类型 只需要一段单独的内存,用于存储实际数据。存放在栈里

引用类型需要两段内存:

  • 第一段存储实际的数据,它总是位于堆中
  • 第二段是一个引用,指向数据在堆中的存放位置。位于栈里

 

(二)   抽象类与接口的区别

抽象类是指设计为被继承的类。抽象类只能用作其他类的基类。

抽象类

  • 不能创建抽象类的实例
  • 抽象类使用abstract修饰符声明
  • 任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员。除非派生类也是抽象类
  • 抽象类可以实现其派生类相同的方法

接口是指定一组函数成员而不实现它们的引用类型。只能用类与结构来实现接口。

  • 不能创建接口的实例
  • 接口声明不包含数据成员、静态成员。
  • 使用interface修饰符声
  • 接口只能包含以下非静态成员函数的声明:方法、属性、事件、索引器。
  • 接口不能包含任何实现代码

个人感觉接口更像做某件事的流程。例如开关机操作一样。

接口可以声明为:

插上电源、按开机按钮、输入登录名称与密码、愉快的玩耍、点击关机、关掉电源

抽象类就是把公用部分自己用代码来实现,不同的地方就用抽象方法,给它的派生类来实现

另外答案请参考:http://zhidao.baidu.com/question/302574596.html

 

(三)   索引器与属性的区别

相同的地方

  • 不用分配内存来存储
  • 主要被用来访问其他数据成员,它们与这些成员关联。为它们提供获取与设定访问,属性表示单独的数据成员;索引器表示多个数据成员

不同的地方

  • 索引器总是实例成员,不能声明为static
  • 索引器没有名称。在名称的位置是关键字this
  • 参数列表在方括号里、必须至少声明一个参数
  • 索引器方式: RuturnType this[ Type param1, …]

另外答案可参考:http://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html

 

(四)   overload重载与override覆写的区别

重载: 一个类中有一个以上的方法拥有相同的名称叫做重载。使用相同的名称的第个方法必须有一个与其它方法不相同的签名:

说明一下签名:方法的名称、参数的数目、参数的数据类型和顺序、参数的修改符。但返回类型不是签名部分。

  • override: 主要是覆写virtual虚方法和abstract抽象方法。

派生类的方法和基类的方法有相同的签名和返回类型

另外答案可参考:http://blog.csdn.net/laodao1/article/details/4473346

 

(五)   C#垃圾回收机制

CLR在合适的时候进行垃圾回收

  早期的C/C++开发中,一个对象的生命周期大概像这样:计算对象大小——查找可用内存——初始化对象——使用对象——摧毁对象。

  CLR托管堆:

  第0代-预算容量256k

  第1代-预算容量2M

  第2代-预算容量10M

手工进行回收用GC

另外答案可参考:http://www.cnblogs.com/solan/archive/2012/08/24/CSharp11.html

 

(六)    泛型的协变与逆变

协变就是在委托过程中,派生类型构造的委托不可以赋值给基类构造的委托。解决方法就是在委托声明时添加out关键字

如下:delegate T Factory<out T>();

逆变就是期望传入基类时允许传入派生对象的特征特征。解决方法是在类型参数中显示使用关键字in

如下: delegate T Action1<in T>(T a)

 

(七)    泛型委托

C#自带两类特殊的委托Fun<T>和Action<T>

Action<T>只能委托必须没有返回值的方法

Fun<T>只能委托有返回值的方法

另可参考: http://www.cnblogs.com/Joetao/articles/2094271.html

http://www.cnblogs.com/laihua/archive/2006/11/17/564044.html

 

(八)   委托与事件

http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

 

(九)   xml与json区别

xml是扩展标记语言,用于标记电子文件使其具有结构性的标记语言,可用标记数据,定义数据类。是一种允许用户对自己的标记语言进行定义的源语言。

json是一种轻量级的数据交换格式,具有良好的可读和快速编写的特征。写法类似于常见对象编程语言。