堆和栈的区别?堆是编译期间由编译器自动分配内存空间,代码中必须对栈的大小有明确的定义;而堆是程序运行期间动态分配内存空间,可根据程序的运行情况确定要分配的堆内存大小。值类型和引用类型?值类型的变量直接存储的就是数据,而引用类型变量存储的对数据的引用;因此,值类型变量在赋值时,赋值的是变量包含的值,而引用类型在赋值时只是复制对象的引用,也就是一个存储地址;值类型的变量的数据存在栈中,而引用类型的变量的值存储在堆中;值类型变量不可以赋值为null,除非可空类型,而引用类型可以;值类型继承自System.ValueType,引用类型继承自System.Object。进程和线程?进程是系统进行资源分配和调度的单位,线程是cpu进行调度和分派的单位;进程 一个程序至少有一个进程,一个进程至少有一个线程;进程有独立的地址空间,所以一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程之间没有独立地址空间,同一进程的多个线程间是共享资源的,一个线程死掉就等于整个进程都卡掉了。描述一下修饰符protected internal?被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。能够阻止某一个类被其他类继承么?可以,使用关键字sealed。能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?可以,标记这个类为public,并标记这个方法为sealed。接口和类区别?(1)接口中的方法不能实现,不能有方法体,类可以(2)一个类可以实现多个接口,但只能继承自一个基类(3)接口中不能定义字段,类中可以(4)接口不能实例化,类可以实例化接口定义的方法前面不能加任何修饰词 类和结构的区别?类是引用类型,结构体是值类型;类调用new创建对象时,是在堆上分配内存,而结构体实例化时是在栈上分配内存;类可以继承和被继承,而结构体都不可以,只可以实现接口;类有默认的构造函数,而结构体没有,可以添加带参数的构造函数。抽象类和接口?相同点:都不能被实例化;都包含未实现的方法声明;派生类都必须实现声明的方法。不同点:抽象类是一个不完整的类,而接口是一个行为规范的定义;抽象类是类,所以可以定义字段,而接口只能定义属性、事件、方法和索引器,不能包含字段;接口可以对多重实现,而抽象类只能被单一继承;抽象类可以继承接口,而接口不能继承自抽象类。什么是抽象类(abstract class)?一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。 什么时候必须声明一个类为抽象类? (1)当这个类中有抽象方法的时候,必须声明类为抽象类 (2)该类没有完全实现父类的抽象方法时,也需要声明为抽象类.net中接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类? 答:net中接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。重写override和重载overload?override是表示重写基类的方法,方法的签名和参数列表都必须与基类的一致;而overload是重载,只要签名相同,参数列表不同。重写的基方法必须是 virtual、abstract 或 override 的,即基方法是虚方法、抽象方法和已经被重写过的方法。其余的普通方法是不能被重写的。什么是虚方法?子类需要对虚方法做什么?虚方法有什么用?一个方法前面有virtual关键字,这就是虚方法。就是用这个关键字标明这个方法是个虚的,标明这个方法有可能会被后面的子类所重写。虚方法实质上是C#多态性的一个体现,所以当需要指明某个方法具有多态性时,就使用虚方法。父亲定义了一个方法,这个方法标明是个虚的,动态的,儿子可以重写这个方法,也可以不重写,儿子需要调用这个方法时,会优先调用自己重写后的方法,如果没有,则只能使用父亲定义的方法。而抽象方法,则是父亲定义了一个方法的签名,但不能有实现代码,强制儿子类中必须有这样一个方法,强制儿子必须要重写实现这个方法。虚函数(Virtual),抽象函数(abstract)和接口的区别?1.virtual:允许被重写,但不强制要求。声明时提供其自身实现; 2.abstract:强制要求其继承者重写。声明时不提供其自身的实现,抽象类不能被实例化; 3.interface:接口就是协议,其声明的成员(属性,方法,事件和索引器)必须由其继承的类实现。接口不能直接被实例化。 虚方法与抽象方法的区别在于,虚方法提供自身的实现,并且不强制要求子类重写;而抽象方法不提供自身的实现,并且强制子类重写。 抽象类与接口很相似,但是思路不一样。接口是公开类的成员,而抽象类则是抽象类成员以要求子类继承并实现。new关键字用法?new作为运算符,用于创建对象和调用构造函数;new作为修饰符,用于继承类向基类隐藏成员;new作为约束,用于在泛型声明中约束可能用作泛型的类型参数的参数的类型。string和StringBuilder区别?string在进行赋值、拼接等运算时,实际上是会产生一个新的对象,存储运算后的值,而将原来的对象删除了,这在创建和销毁对象时就消耗了时间。而StringBuilder,它提供了Append方法,修改时就直接在原有对象上修改。一般情况下,可能感觉不到这个差异,但在对字符串进行频繁操作时,就会有较大差异,建议使用StringBuilder。Equals和==区别?前者:用于引用类型比较,比较两个变量是否是对同一个对象的引用;后者比较两个变量的值是否相等。const和readonly区别?const是编译时常数,后者可以是编译时,也可以是运行时常数;前者只能在字段声明时初始化,后者可以在声明或构造函数中初始化,构造函数不同,后者可能会有不同的值。数组基类:Array 委托基类:MulticastDelegate 获取类型大小:sizeof 栈中分配内存:stackalloc从面向对象的角度思考,什么是多态。 答:多态是指两个或多个属于不同类的对象,对于统一个消息(方法调用)作出不同响应的方式强类型?弱类型?强类型是在编译时就确定类型,执行时不可更改;而弱类型实在执行时才确定类型。强类型更安全,弱类型灵活但不安全。C# Show()和ShowDialog()?show()是非模式窗体.showDialog()是模式窗体.区别在于,以showDialog()打开的窗体,要等窗体关闭后才能操作其他窗体.而show()则不受此限制.return和finally?return只是标记函数的返回值为0,标记完了继续执行finally。装箱?拆箱?装箱和拆箱操作中的性能损耗是如何产生的?装箱是将值类型转化为引用类型的过程;拆箱是将引用类型转化为值类型的过程”。“箱”指的就是托管堆,装箱即指在托管堆中将在栈上的值类型对象封装,生成一份该值类型对象的副本,并返回该副本的地址。而拆箱即是指返回已装箱值类型在托管堆中的地址。Int32 i =4; 定义一个值类型 objct o = i; [装箱]这个值类型被复制并分配到托管堆,并把它转成引用类型O,这一个过程将会造成性能损失。Int32 n = (Int32)O;[拆箱]将托管堆中的引用类型实例复制到栈中,转为值类型n装箱比拆箱损耗大。装箱内耗:分配内存,拷贝数据。1、首先从托管堆中为新生成的引用对象分配内存。 2、然后将值类型的数据拷贝到刚刚分配的内存中。 3、返回托管堆中新分配对象的地址拆箱内耗:拷贝数据1、首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。 2、将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。code_Bhind技术?答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.