c#面试基础问题
CLR是公共语言运行时,是一种多语言执行环境,支持众多数据类型和语言特性。它管理代码的运行,建立一种可靠的执行环境,其功能通过编译器和其他工具共同展现。编译器产生元数据,元数据中包含了类型、成员、引用的信息。运行时通过这些元数据定位并载入类,在内存中展开对象实例,解决方法调用,产生本地代码,强制执行安全性,并建立运行时环境的边界。
CTS是公共类型系统(Common Type System)。这个类型系统提供了多语言无缝集成的条件。.net中的所有编程语言类型都必须建立他的数据类型与CTS的类型间的映射。所有.net语言共享这一类型系统。
这两个名词都被解释为“属性”,不过却没有一点联系。Property是指字段,即类的成员,例如:
//这个就是一个Property
public int Hour
{
get { return hour; }
set { hour = value;}
}
而Attribute则是.net framework文件的元数据,用来表述运行时的代码。一般用“[]”括起来放在类头,方法头,或者属性头来表达一定的含义。例如我们引入一个外部的DLL时候,这些写:
[DllImport("User32.dll")]
强/弱类型是指类型检查的严格程度。语言有无类型、弱类型和强类型三种。无类型的不检查,甚至不区分指令和数据。弱类型的检查很弱,仅能严格的区分指令和数据。强类型则严格的在编译期间检查。
使用哪种语言按需而定。编写简单而小的应用程序,使用弱类型可以节省很多代码量,有更高的开发效率。而对于构建大型项目,使用强类型可能会比弱类型更加规范和可靠。
由上面的解释可以看出c#是强类型语言,而javascript是弱类型语言,因为javascript中用var定义所有变量。
GAC的全称是Global Assembly Cache,他的作用是可以存放一些许多程序都要使用到的公共Assembly,例如System.Data、System.Windows.Forms等。这样许多程序就可以从GAC中取得assembly而不必将所有的assembly都复制到应用程序的应用目录。.net 应用程序在加载的时候会首先查看全局应用程序集缓存,如果有就直接使用,没有再到应用程序目录查找。
- c#中的类型要么是引用类型要么是值类型。引用类型和值类型都继承自Object类型。
- 引用类型的对象分配在托管堆上而值类型的对象通常分配在栈上。
- 值类型包括c#的基本类型,结构体(用struct声明),枚举(用enum声明)。引用类型包括类和委托。
- 引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。值类型总是分配在她声明的地方:最为字段时,跟随其所属的变量(实例)存储;最为局部变量时,存储在栈上。
- 值类型在内存管理方面有更好的效率,适合做存储数据的载体。引用类型支持多态,适合定义应用程序的行为。
- 值类型不能声明为NULL,而引用类型可以。
装箱就是将值类型转换为引用类型的过程,并从栈中搬到堆中。而拆箱就是将引用类型转换为值类型。
装箱和拆箱的过程涉及堆和栈的转换,直接影响性能,使用装箱和拆箱是c#面向对象的精髓。适当的使用装拆箱能够提升程序性能。
const是在编译期间解析的常量且必须在声明是就初始化,他既可以休息类中的成员又可以修饰函数体内的局部变量。在编译的过程中静态常态会替换为对应的值,这就意味着不同的程序集,当你改变静态常量的时候需要将其重新编译,否则常量的值就不会发生变化。
static readonly是运行时解析的常量,所以他不会出现const改变时需要重新编译引用的程序集,同时他的初始化既可以在声明的时候进行也可以在构造函数中初始化。但他只能修饰类中的成员。