1、CLR、CTS、CLS分别是什么意思?
CLR(公共语言运行时,Common Language Runtime),和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。【另有:.NET提供了一个运行时环境,叫做公共语言运行时(CLR),是一种多语言执行环境,支持众多的数据类型和语言特性。它管理着代码的执行,并使开发过程变得更加简单。这是一种可操控的执行环境,其功能通过编译器与其他工具共同展现。】
CTS(公共类型系统,又叫通用类型系统,Common Type System),.NET定义的一个类型标准。这个类型系统不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。换句话说,CTS定义了可以在中间语言中使用的预定义数据类型,所有面向.NET Framework的语言都可以生产最终基于这些类型的编译代码。CTS不仅定义了基本数据类型,还定义了一个内容丰富的类型层次结构,在这些位置上,代码允许定义它自己的类型。CTS的层次结构反应了中间语言的单一继承的面向对象的方法。
CLS(公用语言规范,Common Language Specification)。.NET Framework将CLS定义为一组规则,所有.NET语言都应该遵循此规则才能创建与其他语言可互操作的应用程序,但要注意的是为了使各语言可以互操作,只能使用CLS所列出的功能对象,这些功能统称为与CLS兼容的功能。 例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。这里用的是“可能不”,而不是“不可能”,因为这一问题实际依赖于对non-CLS-compliant项的可见性。事实上,CLS规则只适用于或部分适用于那些与其他组件存在联系的组件中的类型。实际上,用户能够安全实现含私有组件的项目,而该组件使用了用户所选择使用的.NET语言的全部功能,且无需遵守CLS的规范。另一方面,如果用户需要.NET语言的互操作性,那么用户的组件中的公共项必须完全符合CLS规范。
2、什么是基元类型?
由编译器直接支持的类型称为基元类型。例如:C#中的int,string等等就是基元类型,实际运行过程中被映射为FCL中对应的类型(java中叫做包装类),如System.Int32,System.String。
3、值类型和引用类型的区别是什么?为什么要设计值类型?值类型会被GC回收吗?值类型是否能在托管堆分配?
(1)如果一个变量是使用基本的内置数据类型之一或用户定义的结构进行声明的,则该变量是值类型(但string类型除外,它是引用类型)。值类型的内容存储在堆栈上分配的内存中。
引用类型的变量又称为对象,可存储对实际数据的引用。
使用栈效率较高,但值类型的生命周期有限,不适合在不同类之间共享数据。相反,引用类型(例如,类或数组的实例)在另一个被称为“堆”的内存区域中分配,仅当c#的垃圾回收系统确定不再需要该引用类型变量内存时,才进行回收。声明引用类型需要更多系统开销,但它们的优点是可以从其他类进行访问。
(2)、设计值类型为了效率高,快速分配空间。
(3)、值类型不会被GC回收,因为它在栈上(GC只回收托管堆上的内容)。
(4)、值类型不可以在托管堆分配,除非它装箱。
4、Equals、==、ReferenceEquals如何区别使用?
(1)Equals确定指定的实例是否被视为相等,但是如果为空就不能被调用,常被重写(override),如:
Console.WriteLine(i1.Equals(i2));返回的结果为True,
Console.WriteLine(s1.Equals(s2));运行时会出现错误,
Console.WriteLine(s3.Equals(s4));返回的结果为True,
MyClass c1 = new MyClass(); MyClass c2 = new MyClass(); Console.WriteLine(c1.Equals(c2));返回的结果为False。
(2)对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回True,否则返回False。对于string以外的引用类型,如果两个操作数引用同一个对象,则==返回True,否则返回False。对于string类型,==比较字符串的值。如:
Console.WriteLine(i1 == i2);返回的结果为True,
Console.WriteLine(s1 == s2);返回的结果为True,
Console.WriteLine(s3 == s4);返回的结果为True,
Console.WriteLine(c1 == c2);返回的结果为False。
(3)ReferenceEquals确定指定的Object实例是否是相同的实例,不会被重写,基础类型值相等时返回False,如:
Console.WriteLine(ReferenceEquals(i1, i2));返回结果为False,
Console.WriteLine(ReferenceEquals(s1, s2));返回结果为True,
Console.WriteLine(ReferenceEquals(s3, s4));返回结果为True,
MyClass c1 = new MyClass(); MyClass c2 = new MyClass(); Console.WriteLine(ReferenceEquals(c1, c2));返回结果为False。
5、什么是虚方法?如何理解多态?
(1)虚方法就是用virtual修饰的方法。调用虚方法时,将为重写成员检查该对象的运行时类型,将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。它是实现多态的途径之一。
(2)通过多态,实现了对象的多样性,并且实现迟绑定,提高程序的灵活性。
6、overload和override有什么区别?
(1)Overload:c#没有该关键字,理解为重载,属于运行前、编译时的一种技术,是继承的范畴。
(2)Override:是运行时技术,用它实现多态。
7、基于接口编程的目的是什么?什么情况下使用接口,什么情况下使用抽象类?
(1)基于接口编程的目的是为了提高程序的灵活性。
(2)当一个类准备要继承多个类的时候,必须使用接口(因为类只能继承一个类,却可以继承多个接口);当一个方法需要被继承且有方法必须要被定义时,要使用抽象类。
8、委托是什么意思?什么叫委托链?我们能在代码中继承MulticastDelegate吗?
(1)委托是通过对方法名的调用来调用方法的一种对象,委托类似于C++函数指针,但它们是类型安全的。委托允许将方法作为参数进行传递,委托可用于定义回调方法。
(2)将多个委托链接在一起,供对象使用,构成委托链。
(3)MulticastDelegate是一个特殊类,编译器和其他工具可以从此类派生,但是不能显式地从此类进行派生。
9、实现Iterators一般用到哪些接口?
IEnumerable,IEnumerator
10、简要谈一下您对微软.NET架构下Remoting和WebService两项技术的理解以及实际中的应用。
(1)Remoting是.NET中服务端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置,跨越Machine,Process,AppDomain进行方法调用的技术。对于三层结构的程序,就可以使用Remoting技术来构建。它是分布应用的基础技术,相当于以前的DCOM,Remoting可以利用TCP/IP、二进制传送提高效率。
(2)Web Service是一种构建应用程序的普通模型,并能在所有支持Internet网通讯的操作系统上实施。Web Service令基于组件的开发和Web的结合达到最佳,是基于组件的对象模型。Web Service主要利用HTTP协议传输数据,可穿透防火墙。
1、CLR、CTS、CLS分别是什么意思?
CLR(公共语言运行时,Common Language Runtime),和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。【另有:.NET提供了一个运行时环境,叫做公共语言运行时(CLR),是一种多语言执行环境,支持众多的数据类型和语言特性。它管理着代码的执行,并使开发过程变得更加简单。这是一种可操控的执行环境,其功能通过编译器与其他工具共同展现。】
CTS(公共类型系统,又叫通用类型系统,Common Type System),.NET定义的一个类型标准。这个类型系统不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。换句话说,CTS定义了可以在中间语言中使用的预定义数据类型,所有面向.NET Framework的语言都可以生产最终基于这些类型的编译代码。CTS不仅定义了基本数据类型,还定义了一个内容丰富的类型层次结构,在这些位置上,代码允许定义它自己的类型。CTS的层次结构反应了中间语言的单一继承的面向对象的方法。
CLS(公用语言规范,Common Language Specification)。.NET Framework将CLS定义为一组规则,所有.NET语言都应该遵循此规则才能创建与其他语言可互操作的应用程序,但要注意的是为了使各语言可以互操作,只能使用CLS所列出的功能对象,这些功能统称为与CLS兼容的功能。 例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。这里用的是“可能不”,而不是“不可能”,因为这一问题实际依赖于对non-CLS-compliant项的可见性。事实上,CLS规则只适用于或部分适用于那些与其他组件存在联系的组件中的类型。实际上,用户能够安全实现含私有组件的项目,而该组件使用了用户所选择使用的.NET语言的全部功能,且无需遵守CLS的规范。另一方面,如果用户需要.NET语言的互操作性,那么用户的组件中的公共项必须完全符合CLS规范。
2、什么是基元类型?
由编译器直接支持的类型称为基元类型。例如:C#中的int,string等等就是基元类型,实际运行过程中被映射为FCL中对应的类型(java中叫做包装类),如System.Int32,System.String。
3、值类型和引用类型的区别是什么?为什么要设计值类型?值类型会被GC回收吗?值类型是否能在托管堆分配?
(1)如果一个变量是使用基本的内置数据类型之一或用户定义的结构进行声明的,则该变量是值类型(但string类型除外,它是引用类型)。值类型的内容存储在堆栈上分配的内存中。
引用类型的变量又称为对象,可存储对实际数据的引用。
使用栈效率较高,但值类型的生命周期有限,不适合在不同类之间共享数据。相反,引用类型(例如,类或数组的实例)在另一个被称为“堆”的内存区域中分配,仅当c#的垃圾回收系统确定不再需要该引用类型变量内存时,才进行回收。声明引用类型需要更多系统开销,但它们的优点是可以从其他类进行访问。
(2)、设计值类型为了效率高,快速分配空间。
(3)、值类型不会被GC回收,因为它在栈上(GC只回收托管堆上的内容)。
(4)、值类型不可以在托管堆分配,除非它装箱。
4、Equals、==、ReferenceEquals如何区别使用?
(1)Equals确定指定的实例是否被视为相等,但是如果为空就不能被调用,常被重写(override),如:
Console.WriteLine(i1.Equals(i2));返回的结果为True,
Console.WriteLine(s1.Equals(s2));运行时会出现错误,
Console.WriteLine(s3.Equals(s4));返回的结果为True,
MyClass c1 = new MyClass(); MyClass c2 = new MyClass(); Console.WriteLine(c1.Equals(c2));返回的结果为False。
(2)对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回True,否则返回False。对于string以外的引用类型,如果两个操作数引用同一个对象,则==返回True,否则返回False。对于string类型,==比较字符串的值。如:
Console.WriteLine(i1 == i2);返回的结果为True,
Console.WriteLine(s1 == s2);返回的结果为True,
Console.WriteLine(s3 == s4);返回的结果为True,
Console.WriteLine(c1 == c2);返回的结果为False。
(3)ReferenceEquals确定指定的Object实例是否是相同的实例,不会被重写,基础类型值相等时返回False,如:
Console.WriteLine(ReferenceEquals(i1, i2));返回结果为False,
Console.WriteLine(ReferenceEquals(s1, s2));返回结果为True,
Console.WriteLine(ReferenceEquals(s3, s4));返回结果为True,
MyClass c1 = new MyClass(); MyClass c2 = new MyClass(); Console.WriteLine(ReferenceEquals(c1, c2));返回结果为False。
5、什么是虚方法?如何理解多态?
(1)虚方法就是用virtual修饰的方法。调用虚方法时,将为重写成员检查该对象的运行时类型,将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。它是实现多态的途径之一。
(2)通过多态,实现了对象的多样性,并且实现迟绑定,提高程序的灵活性。
6、overload和override有什么区别?
(1)Overload:c#没有该关键字,理解为重载,属于运行前、编译时的一种技术,是继承的范畴。
(2)Override:是运行时技术,用它实现多态。
7、基于接口编程的目的是什么?什么情况下使用接口,什么情况下使用抽象类?
(1)基于接口编程的目的是为了提高程序的灵活性。
(2)当一个类准备要继承多个类的时候,必须使用接口(因为类只能继承一个类,却可以继承多个接口);当一个方法需要被继承且有方法必须要被定义时,要使用抽象类。
8、委托是什么意思?什么叫委托链?我们能在代码中继承MulticastDelegate吗?
(1)委托是通过对方法名的调用来调用方法的一种对象,委托类似于C++函数指针,但它们是类型安全的。委托允许将方法作为参数进行传递,委托可用于定义回调方法。
(2)将多个委托链接在一起,供对象使用,构成委托链。
(3)MulticastDelegate是一个特殊类,编译器和其他工具可以从此类派生,但是不能显式地从此类进行派生。
9、实现Iterators一般用到哪些接口?
IEnumerable,IEnumerator
10、简要谈一下您对微软.NET架构下Remoting和WebService两项技术的理解以及实际中的应用。
(1)Remoting是.NET中服务端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置,跨越Machine,Process,AppDomain进行方法调用的技术。对于三层结构的程序,就可以使用Remoting技术来构建。它是分布应用的基础技术,相当于以前的DCOM,Remoting可以利用TCP/IP、二进制传送提高效率。
(2)Web Service是一种构建应用程序的普通模型,并能在所有支持Internet网通讯的操作系统上实施。Web Service令基于组件的开发和Web的结合达到最佳,是基于组件的对象模型。Web Service主要利用HTTP协议传输数据,可穿透防火墙。