C#的一些面试题

const和readonly static的区别

用const修饰符声明的成员叫常量,是在编译时初始化嵌入到程序里的;用static readonly修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法,但与常量不同的是这种变量是在运行时初始化的

extern关键字是什么意思

extern修饰符用于声明由程序集外部实现的成员函数,经常用于系统API函数的调用(通过DllImport)。注意,和DllImport一起使用时要加上static修饰符

abstract关键字是什么意思

abstract修饰符可以用于类、方法、属性、事件和索引指示器,表示其为抽象成员。abstract不可以和static、virtual一起使用。声明为abstract成员可以不包含实现代码,但只要类中还有未实现的抽象成员(即抽象类),那么它的对象就不能被实例化。通常用于强制继承类实现某一成员

internal修饰符起什么作用

internal修饰符可以用于类或成员,使用该修饰符声明的类或成员只能在同一程序集内访问。接口的成员不能使用internal修饰符。值得注意的是,如果为internal成员加上protected修饰符,这时访问级别为internal或protected

sealed修饰符起什么作用

sealed修饰符表示密封,用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互斥;用于方法和属性时,表示该方法和属性不能再被重写,必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员。通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构混乱。恰当地利用sealed修饰符可以提高一定的运行效率,因为不用考虑继承类会重写该成员

什么是索引指示器

实现索引指示器(indexer)的类可以像数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int。其本质就是一个含参数的属性

this关键字的含义

this是一个保留字,仅限于构造函数和方法成员中使用。在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用。在结构的构造函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用。this保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化。在C#中,this实际上是一个常量。this保留字一般用于限定同名的隐藏成员、将对象本身作为参数、声明索引访问器、判断入参的对象是否为本身

new修饰符起什么作用

new修饰符和new操作符是两个概念。new修饰符用于声明类和类的成员,表示隐藏了基类中的同名成员。而new操作符用于实例化一个类型。new修饰符只能用于继承类,一般用于弥补基类设计的不足。new修饰符和override修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互斥

可以使用抽象函数重写基类中的虚函数吗

可以。需使用new修饰符显示声明,表示隐藏了基类中该函数的实现。或增加override修饰符,表示抽象重写了基类中该函数的实现

密封类可以有虚函数吗

可以。基类中的虚函数将隐式地转化为非虚函数,但密封类本身不能再新增新的虚函数

什么是属性访问器

属性访问器(Property Accessor),包括get访问器和set访问器分别用于字段的读写操作。其设计目的主要是为了实现面向对象(OO)中的封装思想。根据该思想,字段最好设为private,一个精巧的类最好不要直接把字段设为公有提供给客户端调用直接访问。另外要注意属性本身并不一定合字段相联系

abstract可以和virtual一起使用吗?可以和override一起使用吗

abstract修饰符不可以和static、virtual修饰符一起使用。abstract修饰符可以和override一起使用,参见使用抽象函数重写基类中的虚函数

接口可以包含哪些成员

接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员

类和结构的区别

类是引用类型在堆上的分配,类的实例进行赋值只是复制了引用,都指向同一实际对象分配的内存。结构是值类型在栈上的分配(虽然栈的访问速度比堆要快,但栈的资源有限),结构的赋值将分配产生一个新的对象。类可以被继承,结构不可以,但和类一样可以继承自接口

接口的多继承会带来哪些问题

C#中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。但如果两个父成员具有同名的成员,就产生了二义性(这也是C#中取消了多继承的原因之一),这时在实现时最好使用显示的声明

抽象类和接口的区别

抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义。抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性。接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性。分析对象,提炼内部共性形成抽象类,用以表示对象本质。为外部提供调用或功能需要扩展时优先使用接口

别名指示符是什么

通过别名指示符我们可以为某个类型起一个别名。主要用于解决两个命名空间内有同名类型的冲突或避免使用冗余的命名空间。别名指示符在所有命名空间的最外层定义,作用域为整个单元文件。如果定义在某个命名空间内,那么它只在直接隶属的命名空间内起作用

如何手动释放资源

.NET平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作。但在以下两种情况下需要我们手动释放资源:
一、由于它无法对非托管资源进行释放,所以我们必须自己提供方法来释放对象内存分配的非托管资源,比如在对象的实现代码中使用了一个COM对象。
二、你的类在运行时会产生大量的实例(像GIS中的Geometry),必须自己手动释放这些资源以提高程序的运行效率。
最理想的办法就是,通过实现一个接口显示地提供给客户端调用,手动释放对象,System命名空间内有一个IDisposable接口,可以用来做这事

P/Invoke是什么

在受控代码与非受控代码进行交互时会产生一个事物(transition),通常发生在使用平台调用服务(Platform Invocation Services),即P/Invoke。如调用系统的API或与COM对象打交道,通过System.Runtime.InteropServices命名空间,虽然使用Interop非常方便,但据估计每次调用事务都要执行10到40条指令,算起来开销也不少,所以我们尽量少调用事务。如果非用不可,建议本着一次调用多个动作,而不是多次调用每次只执行少量动作的原则

StringBuilder和String的区别

String在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder则不会。所以在大量字符串拼接或对某一字符串进行操作时,最好使用StringBuilder,不要使用String。另外对于String,不得不说几句:
一、String是引用类型,在堆上分配内存。
二、运算时会产生一个新的实例
三、String对象一旦生成不可改变(Immutable)
四、定义相等运算符(==和!=),是为了比较String对象的值,而不是引用

explicit和implicit的含义

explicit和implicit属于转换运算符,这两者可以让我们自定义的类型支持相互转换。隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多用implicit运算符。不过,如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用explicit运算符,以便在编译时就能警告客户端

params有什么用

params关键字在方法成员的参数列表里使用,为该方法提供了参数个数可变的能力。它只能出现一次并且不能在其后再有参数定义,之前可以

什么是反射

反射(Reflection),通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件。通过对类型动态实例化后,还可以对其执行操作。简单来说就是用string可以在runtime为所欲为的东西,一般用于插件式框架程序和设计模式的实现

DataReader和DataSet的异同

DataReader使用时始终占用SqlConnection,任何对SqlConnection的操作都会引发DataReader的异常。因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的。因为DataReader的特殊性和高性能,所以DataReader是只进的,你读了第一条后就不能再去读取第一条了
DataSet则是将数据一次性加载在内存里,读取完毕即放弃数据库连接。因为DataSet将数据全部加载在内存中,所以比较消耗内存,但是确实比DataReader要灵活,可以动态添加行、列、数据,对数据库进行回传更新操作

触发器的作用

触发器可以查询其它表,而且可以包含复杂的SQL语句。它们主要用于强制复杂的业务规则或要求。触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系,保证数据库操作变更能接到通知

如何理解委托

委托类似于C或C++中的函数指针。使用委托可以将方法引用封装在委托对象内,然后可以讲该委托对象传递给可调用所引用方法的代码,而不必在编译时知道讲调用哪个方法。与C或C++的函数指针不同,委托是面向对象、类型安全的

ASP.NET的身份验证有哪些?分别是什么原理

window验证:为每个用户开启window账号,验证其身份,安全性较高
forms验证:为每个登录用户写入一个身份验证票据,在web使用最广的验证方式,灵活方便

什么是SOAP?有哪些应用

简单对象接受协议(Simple Object Access Protocal),以XML为基本编码结构,建立在已有通信协议上的一种规范。是Web Service使用的协议

如何理解.NET中的垃圾回收机制

如果发现内存不够,垃圾回收器将全部对象作为无效对象,然后先将全局变量、static、处于活动中的局部变量以及当前CG指针指向的对象放入一个表中,其它没有被加入列表的对象都会被回收

property和attribute的区别

一个是属性,用于存取类的字段,一个是特性,用来标识类、方法等的附加性质

ADO.NET相对于ADO有什么改进

新增DataSet等,不需要随时保持连接,性能提高

ASP.NET相对于ASP有什么改进

asp解释型,aspx编译型,性能提高,有利于保护源码

avatar

chilihotpot

You Are The JavaScript In My HTML