1、New用法:
第一种是,实例化如:New Class()
第二种是,public new 隐藏基类的方法
第三种是,在泛型类申明中的任何类型参数都必须有公共的无参构造函数。
2、Using用法:
Using 引入一个名子空间,或在使用了一个对像后自动调用其IDespose。
3、Override关键字
要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
(1)、override 方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。
(2)、不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。
(3)、override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的访问级别修饰符。
(4)、不能使用 new、static 或 virtual 修饰符来修改 override 方法。
4、virtual 关键字
(1)、用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
(2)、调用虚方法时,将为重写成员检查该对象的运行时类型。 将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
(3)、默认情况下,方法是非虚拟的。不能重写非虚方法。
(4)、virtual修饰符不能与static、abstract, private 或 override 修饰符一起使用。
(5)、在静态属性上使用 virtual 修饰符是错误的。
(6)、通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。
5、Abstract关键字:
abstract 修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。 在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。 标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
抽象类具有以下特性:
(1)、抽象类不能实例化。
(2)、抽象类可以包含抽象方法和抽象访问器。
(3)、不能用 sealed(C# 参考) 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。 采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。
(4)、从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
(5)、在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
抽象方法具有以下特性:
(1)、抽象方法是隐式的虚方法。
(2)、只允许在抽象类中使用抽象方法声明。
(3)、因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。
例如: public abstract void MyMethod();
(4)、实现由一个重写方法override提供,此重写方法是非抽象类的一个成员。
(5)、在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
(6)、在静态属性上使用 abstract 修饰符是错误的。
6、Sealed关键字:
(1)、当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。 在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承。
例:class A {}
sealed class B : A {}
(2)、当在类中定义新的方法或属性时,通过不将这些方法或属性声明为 virtual,可防止派生类重写这些方法或属性。
(3)、将 abstract 修饰符用于密封类是错误的做法,因为抽象类必须由提供抽象方法或属性的实现的类继承。
(4)、当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。
(5)、由于结构是隐式密封的,因此它们不能被继承。
7、new和overide的区别,new只是避免了一个编译警告提示,在类的hanle type里其实两个方法都存在,类型为子类是调用子类的方法,类型为父类时调用父类方法;overide的情况,handle type里只有一个方法就是重载后的方法。
8、什么是Interface?它与Abstract Class有什么区别?
接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类。
9、结构体(Struct) 和 类(Class)
答:对于结构和类,初看上去都一样。都可以有自己的字段,属性,方法,还能有构造函数。但是这两者其实有很大的不同,而且各自有各自的应用范围。下面还是谈谈两者的分别吧。
<1> 结构的特点和性能优势
结构是值类型,继承自System.ValueType。结构相对于类来说有两个性能上的优势,结构通常分配在栈(Stack)上面,类的实际内容通常分配在堆(Heap)上面,访问栈的速度会比访问堆的速度更快。但是这并不是一个明显的优势。最主要的是栈上面的内容释放是非常快的,通常在函数调用结束以后,栈就自动释放了;但是对于堆来说,必须等待垃圾收集器(Garbage Collector)来收集,往往垃圾收集器的工作都有滞后特性,所以我们不一定当时就能注意到性能的变化,但是这种影响终究会体现出来。
<2> 结构的弱点
(1)作为参数传递的时候效率低
(2)装箱(Boxing)和解箱(Unboxing)效率低
<3>何时使用结构,何时使用类?
在下面的情况下使用类
1 内容很多的时候,因为结构总是暗地里拷贝了一个临时变量。
2 需要非常多内存的时候,因为栈的容量有限,而堆通常是足够使用的。
3 需要在声明字段的时候进行初始化。
4 需要从基类继承。
5 需要多态性。接口也可以用来实现多态性,但是因为结构是值类型,尽管它可以从接口继承,但是在多态过程中会进行装箱和解箱的操作。
在下面的情况下使用结构
1 希望能够象原始类型(比如int,double之类的)一样使用它。比如我们可以声明一个复数结构,然后像double类型一样地使用它。
2 需要的内存较少,栈可以完全地容纳它。
3 想避开垃圾收集器的处理,自己掌握资源的释放。
4 只需要缺省的值,而不需要在声明字段的时候赋值。
5 不需要从基类继承,当然,不包括ValueType。
6 不需要多态行为。
10、简述 private、 protected、 public、 internal 修饰符的访问权限。
答 private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 在同一命名空间内可以访问。
11、C#中的委托是什么?事件是不是一种委托?
委托是一种定义方法签名的类型。委托具有以下特点:
(1)、委托类似于 C++ 函数指针,但它们是类型安全的。
(2)、委托允许将方法作为参数进行传递。
(3)、委托可用于定义回调方法。
(4)、委托可以链接在一起;例如,可以对一个事件调用多个方法。
(5)、方法不必与委托签名完全匹配。
(6)、C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 C# 3.0 引入了 Lambda 表达式,利用它们可以更简练地编写内联代码块。 匿名方法和 Lambda 表达式(在某些上下文中)都可编译为委托类型。 这些功能统称为匿名函数。
事件是一种特殊的委托。
联系客服