。net面试题(2)

什么是抽象类(abstract class)?
一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽

象类的抽象方法后才能被实例化。

何时必须声明一个类为抽象类?
当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

接口(interface)是什么?
只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。

为什么不能指定接口中方法的修饰符?
接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。

可以继承多个接口么?
当然。

那么如果这些接口中有重复的方法名称呢?
这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。

接口和抽象类的区别是什么?
接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指

定方法的访问修饰符。

 


详述.NET里class和struct的异同!

类是引用类型,可以继承类、接口和被继承,有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。
结构是值类型,只能继承接口,不能被继承,没有默认的构造函数,可以创建,没有析构函数,不可以用abstract和sealed,没有protected修饰符,可以不用new初始化。


如何选择结构还是类
1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2. 结构表示如点、矩形和颜色这样的轻量对象
例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。
在此情况下,结构的成本较低。
3. 在表现抽象和多级别的对象层次时,类是最好的选择
4. 大多数情况下该类型只是一些数据时,结构时最佳的选择


C#中的接口和类有什么异同。
异:
不能直接实例化接口。
接口不包含方法的实现。
接口、类和结构可从多个接口继承。但是C# 只支持单继承:类只能从一个基类继承实现。
类定义可在不同的源文件之间进行拆分。
同:
接口、类和结构可从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口可以包含事件、索引器、方法和属性。
一个类可以实现多个接口。


const和readonly有什么区别?
const关键字用来声明编译时常量,readonly用来声明运行时常量。

用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永

远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。


虚函数的用法
答:
1)virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字.
2)一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特征.
3)子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的.
4)不是纯虚函数时,父类的虚函数必须要实现; 而若将父类的虚函数设定为纯虚函数时,子类必需要覆盖之而且必须要实现之!

解释virtual、sealed、override和abstract的区别
virtual申明虚方法的关键字,说明该方法可以被重写
sealed说明该类不可被继承
override重写基类的方法
abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。


重载和覆写有什么区别?
答:重载是方法的名称相同,不同的参数类型,不同的参数个数,不同的参数顺序。覆写提供了子类中改变父类方法行为的实现(是进行基类中函数的重写)。

在方法定义中,virtual有什么含义?
答:被virtual修饰的方法可以被子类覆写

能够将非静态的方法覆写成静态方法吗?
答:不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。

可以覆写私有的虚方法吗?
答:不可以,甚至子类中无法访问父类中的私有方法

能够阻止某一个类被其他类继承吗?
答:可以,使用关键字sealed

能够实现允许某个类别继承,但不允许其中的某个方法被覆写吗?
答:可以,标记这个类为public,并标记这个方法为sealed。


如何区别重载方法?
不同的参数类型,不同的参数个数,不同的参数顺序

 


C#中的委托是什么?事件是不是一种委托?     
委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向一个函数的引用。是,是一种特殊的委托


C#中的堆和栈

栈(Stack)由系统管理生存期,存储代码执行和调用路径,执行或调用完毕即从栈中清除;
堆(Heap)中保存值和对象,调用完毕之后依然存在,由垃圾回收器查找栈中有无指向该值或对象的引用,无则从堆中删除

 

你对泛型了解吗?简单说明一下泛型的有什么好处?

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用
好处是——类型安全和减少装箱、拆箱。提高性能、类型安全和质量,减少重复性的编程任务


C#中所有对象共同的基类是什么?
System.Object.

如何在C#中实现继承?
在类名后加上一个冒号,再加上基类的名称。


C#支持多重继承吗?
不支持。可以用接口来实现。

被protected修饰的属性/方法在何处可以访问?
在继承或间接继承与这个类的子类中可以访问。


私有成员会被继承么?
会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。


C#提供一个默认的无参构造函数,当我实现了另外一个有一个参数的构造函数时,还想保留这个无参数的构

造函数。这样我应该写几个构造函数?
答:两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参构造

函数。

posted @ 2012-04-11 10:27  豪迈人生  阅读(362)  评论(5编辑  收藏  举报