面试宝典复习笔记
什么是CTS,CLS,CLR?
答:CLR(commom Lauguage Runtime)公共语言运行库
CTS(common Type System)通用类型系统
CLS(common Lauguage System)公共语言系统是CTS的一个子集。
CIL (common Intermediate Language)公共中间语言
标准答案:CLR 是CLI的实现,包含了运行引擎和符合CLI(公共语言基础)的类库。CTS包含在MS提交的CLI规范中,定义了一个可以在CLR上运行的类型规范。
开发和运行程序需要的最基本的环境是什么?
答:需要一个文字编辑器和针对编码语言的编译器。对c#来说,为。运行 程序,需要安装 framwork组件。
Net支持多种编程语言开发,但所有设计必须符合CLS规范以保证编程语言之间的特性差异不会产生运行
时的异常。
CLR技术与COM技术的比较
答:CLR和COM都定义了组件间交互的规范。COM并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多版本升级和控制的问题。CLR运用元数据和逻辑类型定义等机制,有效地解决了COM遗留的一些问题。相对于COM模型,CLR更容易理解和学习。
春娇与志明台词什么是程序集和应用程序域
答:程序集(Asmbly)是一个由类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个头文件上,也可以设置单独一个文件来包含该清单。
应用程序域是CLR中提供代码运行范围、错误隔离和安全设置隔离的逻辑单元,功能类似于操作系统的进程。一个或多个应用程序域在一个操作系统的进程中运行。应用程序域的创建和销毁所需的开销,相当于操作系统的进程较小。但和操作系统进程一样,应用程序域之间的数据共享相当困难。
Net程序被编译成什么形式的代码?
答:程序在第一次编译后,形成CLR头、元数据和中间代码。在实施运行或部署时,将经过第二次编译,编译的结果是在CLR中可执行的机器代码。
JIT是如何工作的?
答:JIT(just in time)实时编译。JIT引擎在编译中间代码之前,会寻找方法的本机机器代码缓存并且判断其是否可用,如果可用则直接加载,如果不可用,JIT引擎会查找类型中的方法存根,找到该中间代码并且进行编译。
简述程序集的加载机制。
答:CLR通过System.Reflection.Assmbly.LoadFrom 和System.Reflection.Asmblty.Load 来主动地加载程序集。前者通过位置而后者通过唯一标识强命令程序集的4个元素来标识程序集。CLR的加载机制和Load方法一致,其内在的策略是依次通过版本策略、CODEBASE
位置、应用程序域和应用程序位置来查找程序集。
如何配置程序集的版本策略
答:CLR支持在3个级别上设定版本策略,依次是:应用程序策略、发行者策略和计算机策略。所有策略的设置都是通过修改配置文件(fig)来实现。3个级别的策略会依次被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。发行者策略仅仅针对放入GAC(全集程序集缓存)的程序集,并且可以在应用程序策略中被指定忽略。
如何生成强签名的程序
答:生成强签名的程序集需要有公钥/私钥对。在得到了公钥/私钥对后,就可以控制编译器的输入参数来得到一个强签名的程序集。对于c#的编译器csc 来说,可以用/keyfile 参数来制定使用哪个公钥/私钥文件。
如何把程序集放入GAC中
答:GAC全局程序集缓存(Global Asmbly Cache)。GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以被放入GAC中。可以通过。Netfreamwork自带的asmbly viewer 来简单地拖动一个程序集到GAC中,也可以使用工具命令行来添加。总之,任何方法归根到底,都是根据GAC的规范和程序集本身的特性,在GAC目录下建立相应的子目录结构。
延迟签名及其作用
答:延迟签名就是把强签名程序集的私钥加密和数字签名延迟到实际发布时进行。延迟签名提高了开发测试阶段的效率,也方便了机构和项目管组管理自己的私钥。
程序集的版本分哪几个部分
答:程序集的版本号分为四个部分:主版本号、次版本号、内部版本号和修订号。
面试真题:
1,使用c++语言能否编写可以在框架上运行的程序?
2.什么是受托管的代码?
3.什么是应用程序域?它和进程有什么区别?
4.做强签名的程序集与不做强签名的程序集有什么不同?
5.如何单独升级系统中的某一个程序集。
6.公钥和私钥的概念和作用是什么?
黄子滔
7.把程序集放入GAC中有什么好处?
8用什么技术来解决dll hell问题。
又a又b9,编译时如何制定版本?
10.延迟签名有何作用?
.
net中所有内建类型的基类是什么?
答:System.Object是中所有内建类型的基类。
Object中包含哪些方法?哪些是虚方法?
答:包括8个方法
公共实例方法:
Virtual bool Equals(object obj)
Virtual int GetHashCode()
Type GetType()
Virtual string toString()
毛尖怎么泡公共静态方法
Bool Equals(object objA,object ojbB)
Bool referenceEquals(object ojbA, object objB)
白羊座的女生
受保护的实例方法
Object MemberwiClone()
Finalize
System.ojbect包含了Finalize 在内的8个方法。其中有3个虚方法:Equals,gethashcode,Tostring方法。在设计类型时,当需要对类型对象进行内容比较时,可以考虑重写Equals方法。
值类型和引用类型的区别?
答:所有继承自system.V alueType的类型都是值类型,而其他类型都是引用类型。值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。值类型的对象分配在堆栈上,而引用类型的对象分配在堆上。当比较两个值类型时,进行的是内容比较,而比较两个引用类型时,进行的是引用比较。
三个区别:
赋值区别(将一个赋值给另一个是否会产生副本),即两个值赋值之后,改变其中一个,另外一个是否会跟着改变。
,内存分配区别(堆(引用)和堆栈(值)的区别,堆的空间大,堆栈的空间小,但效率高)继承结构区别(equals的区别)
值类型的比较方法Equals有了一些改变。
值类型已经实现了内容的比较,而引用类型在没有重写Equals方法的情况下,仍采用引用比较。
简述装箱和拆箱原理
答:装箱和拆箱本质上是值类型在转换到system.object时引发的堆栈和堆的一系列移动操作。装箱时值类型从堆栈上被复制到堆上,而拆箱是从堆上复制到堆栈上。装箱和拆箱对性能有比较大的影响,应该避免任何没有必要的装箱和拆箱操作。
何为装箱,何为拆箱?
答:所有值类型必然都隐式地转换为System.Object类型,当这个转换发生时,CLR需要做额外的工作把堆栈上的值类型移到堆上,这个操作被称为装箱。
田馥甄的歌
拆箱是装箱操作的反操作,把堆中的对象赋值到堆栈中,并且返回其值。
微信封面背景图C#是否有全局变量?
答:没有传统意义的全局变量,在c#程序中,任何对象数据都必须属于某个类型。通过公共静态变量,可以实现以前全局变量的所有功能。
public static main()
Struct 和class 的区别,struct适合哪些场合?
答:结构是值类型而类是引用类型。结构不具备继承的特性,程序员不能定义一个继承自其它结构或者类的结构。结构虽然可以重写定义system.object中的虚方法,但程序员不能定义新的虚方法和抽象方法。结构不能拥有无参数的构造方法,也不能为成员变量定义初始值。结构作为一个微型的值类型的“类”,常用于存储数据的集合,但那些涉及复杂操作的类型,应该被设计成类而不是结构。
类型的初始化器何时被调用?
答:类型的初始化器是指具有和类型相同名字、无参数无返回并且以static定义的方法。。。。
C#中方法的参数可以有哪几种传递方式?可以啪的游戏
答:一共有三个可选关键字可以修饰方法的参数:ref,out和f和out都实现了参数的引用传递,区别在于ref要求参数是否在传入前被初始化,而out要求参数在方法返回前被初始化,params实现了参数数目可变的方法。
传递数组时是引用传递(意味着改变即改变)
C#中的string 和String有什么区别?
答:在c#中,string和String,object 和Object的关系非常简单。它们是相同的,完全是同一个类型。在中string是String类型的一个别称,而object是Object的一个别称。String和string 是同一个类型的两个名字,相同情况还有object 和Object,除了名称之外,没有任何区别。
支持几种访问级别?
答:定义了6种,分别为Private, Family,Asmbly,Family&Asmbly, Family or Asmbly ,Public.
对应的关键字为:private,protected,internal,protected interal,public.
简述属性的特点及属性和方法的异同。
答:c#属性是指有返回值而无参数的一种特殊的方法,允许程序员方便地为成员变量提供一种t/get(或者其中任意一个)方法,属性的使用和公共成员变量完全一致,却拥有更好的可扩展性。属性的本质和传统的t/get×××函数一样,但语法更加优美,代码更加简洁易读。
简述c#中的浅复制和深复制
答:浅复制和深复制的区别?
浅复制是指复制类型中的所有值类型成员,而只复制引用类型成员的引用,并且使目标对象共享原对象的引用类型成员对象。深复制是指同时复制值类型成员和引用类型成员的对象。浅复制和深复制的概念都是递归的。System.Object中的MemberwiClone已经实现了浅复制,但它是一个受保护的方法。无论浅复制或深复制,都可以通过实现ICloneable接口的Clone方法来实现,可被继承的类型需要谨慎地实现ICloneable接口,因为这将导致所有的子类型都必须实现ICloneable接口。
简述c#中的循环语法和各自的特点
答:while ,do while,for,foreach
For foreach 则经常被用来遍历数组和集合。Foreach语句可以遍历任意实现了IEnumberable 接口的容器类,但foreach不允许直接或者通过属性修改每个迭代项目的值。可以通过调用项目的方法来达到
修改的目地。Foreach语句拥有较好的执行效率和突出的语句健壮性。
C#中的using 语句有什么作用?
答:using语句实现了IDisposable的类型对象调用Dispo方法,using语句能够保证使用的对象的方法在using语句块结束时被调用,无论是否有异常抛出。C#编译器在编译时自动using语句加上try/finally 块,所以using的本质和异常捕捉语句一样。但语法更为简洁。所有using使用的对象都应该在using语句开始后再初始化,以保证所有的对象都能够被dispo。
内存管理和垃圾回收
简述中堆栈和堆的特点和差异
答:程序在进程内存中分配出堆栈、托管堆和非托管堆。所有的值类型对象和引用类型对象都分配在堆栈上,堆栈根据对象的生命周期来依次分配和释放,堆栈根据一个指向栈尾的指针来分配内存,效率较高。
所有引用类型对象分配在托管堆上,托管堆连续分配内存,并且受net垃圾收集机制管理,受托管的内存分配和释放涉及复杂的内存管理,效率相对堆栈来说低得多。
需要分配堆内存的非托管类型将被分配在非托管堆上,非托管堆不受。Net垃圾收集机制管理,内存块完全由程序员手动申请和释放。
执行string abc=”aaa”+”bbb”+”ccc”共分配了多少内存?
答:在堆栈上分配了一个存储字符串引用的内存块,并在托管堆上分配了一块用于存储“aaabbbccc”这个字符串对象的内存块。
.Net内存分配原则:
引用类型:在堆栈上分配一个引用对象,在堆上分配一个对象实例
NET中GC的运行机制
答:垃圾回收是指收集释放托管堆上不再被使用的对象内存。其过程基本包括:通过算法找到不再被使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。
垃圾回收的成本较高,对性能的影响较大。程序员在编写代码时,应该避免不必要的内存分配,尽量减少或避免使用GC.Collect来执行垃圾回收。
Dispo方法和Finalize方法在何时被调用
答:Dispo方法被使用者主动调用,而Finalize方法在对象被垃圾回收的第一轮回收后,由一个专用的线程进行调用。Dispo方法不能保证被执行,而net的垃圾回收机制保证了拥有Finalize方法并且需要被调用的类型对象的Finalize方法被执行。调用Finalize方法涉及了一系列复杂的操作,性能代价非常高,程序员可以通过GC.SupressFinalize方法通知该对象的Finalize方法不需要被调用。
GC中代(Generation)是什么,一共分为几代?
答:垃圾回收机制按照对象不被使用的可能性把托管堆内的对象分为3代:0代、1代和2代。越小的代有越多被释放的机会,而每一次GC中仍存活的对象实例将被移到下一代上。