C#面试题详解

1,什么是强类型,什么是若类型?

强若类型是指类型检查的严格程度,语言有无类型、弱类型和强类型三种。无类型的语言不检查且不区分指令和数据;若类型的语言检查很弱,仅能严格区分指令和数据;强类型语言则严格地在编译的时候进行检查。例如,C语言和JavaScript是若类型语言,Java和C#是强类型语言。

技巧提示:编写简单小应用,使用弱类型语言可以节省代码量,有更高的开发效率;而对于构建大型项目,使用强类型语言会更加规范可靠。

2,为什么在C#中我们不担心内存漏洞?

解析:考察C#的内存管理机制。C#采用垃圾回收机制来管理内存,当程序运行时,垃圾收集器在内存中建立一个托管堆,每使用一次new运算符,运行库就在上一个对象之后为新建的对象在托管堆中分配一个内存空间,垃圾收集器保存了一个指针,该指针始终指向最后一个对象的内存空间。当该指针指向托管堆以外的空间时,就需要对该托管堆中的无用内存进行回收,此时假设队中的所有的对象都需要回收。

说明:垃圾回收机制是C#相对于C和C++的一大优点,它不需要程序员显示地删除动态分配给堆的内存。

GC 是垃圾收集器,C#程序员不用担心内存管理,因为垃圾收集器会自行进行管理。如果要请求垃圾收集,可以使用下面的方法之一:

System.gc()

Runtime.getRuntime().gc()

3,谈谈final,finally和finalize的区别

final是一个修饰符,如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承;而如果将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声名时给定初值,而在以后的引用中只能读取,不可修改;被声明为final的方法同样也只能使用,不能重载。

finally用来在异常处理时执行任何任何清除操作,如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。

finalize(_)是一个方法名,是在垃圾收集器删除对象之前对这个对象调用的,它是Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其它清理工作。

4,const和readonly有什么区别?

C#定义了两种类型的常量,一种用const关键字声明,一种用readonly关键字声明。用const声明的是真正的常量,而用readonly声明的实际上是“只读的变量”。const声明的变量在编译时进行设置并且设置后就永远不能改变,此时编译器会把所有的const常量全部替换为常数;而readonly声明的常量是在程序运行期间初始化,该操作只能进行一次。另外,const常量只能在声明中赋值,readonly常量的初始化既可以在声明中进行,也可以在构造函数中进行,使用构造函数,readonly字段可被赋予不同的值。

总之,const关键字用来声明编译时的常量,readonly用来声明运行是常量。

5,引用类型何止类型的区别?

C#中的数据类型有两种,分别是值类型和引用类型,二者的差异在于数据的存储方式,值类型直接存储数据;而引用类型则存储实际数据的引用,程序通过此引用找到真正的数据,因此引用类型的变量通常也叫做对象。对于值类型,由于每个变量都有自己的值,所以对一个变量的操作不会影响另一个变量;而对于引用类型来说,两个或多个引用类型的变量引用同一个对象,实际上是指这些变量在堆栈中保存的堆地址相同,因此对一个变量的操作会影响到引用相同对象的另一个变量。

技巧:值类型变量声明初始化后即可访问,引用类型变量必须先使用new关键字为其声明的变量分配内存后方可访问。

引用类型存储在堆上,包含一个指向实例的指针,默认值为null;值类型存储在堆上,存储的是一个实际的值。未赋值前不同值类型有不同的默认值但不能为空。

6,简述堆和栈的区别?

栈是由编译器自动分配,释放的,在方法体中定义的变量通常在栈上。堆一般由程序员分配释放,用new运算符等分配内存方法分配得到的就是在堆上。栈是机器系统提供的数据结构,而堆是C/C++函数提供的,他们的区别如下:

栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能。特点是灵活方便,数据适应面广泛,但是效率有一定降低。

栈是系统数据结构,对于进程或线程式唯一的;而堆是函数库内部的结构,不一定唯一,不同的堆分配的内存无法相互操作。

栈空间分静态分配和动态分配两种,其中,静态分配是编译器完成的,比如自动变量的分配;而动态分配是由啊alloca()函数完成的,栈的动态分配无需释放,但为了可移植的程序,栈的动态分配操作是不鼓励的。堆空间的分配总是动态的。

答案:栈是编译期间就分配好内存空间,因此代码中必须就栈的大小明确定义;堆是程序运行期间动态分配内存空间,可以根据程序的运行情况确定要分配的堆的大小。

7,简述枚举的作用?

枚举通常用于定义多个常量,这些常量公用一种基本的数据类型,该类型在定义是由冒号来指定。

答案:枚举可以避免不合理的赋值,它表示一组有限的值,对可能的值进行约束,是代码更清晰。并且允许使用描述性的名称表示数据,使用时直观方便。

待续....

原文地址:https://www.cnblogs.com/javawebsoa/p/3104894.html