C#中的new关键字的用法
C#中的new关键字可用做运算符,修饰符或约束。
1. new作运算符时有两种用法,创建对象和调用构造函数。例如:
Class1 obj=new Class1();
也可用于创建匿名类型的实例:
var query = from cust in customer select new {Name=cust.Name,Address=cust.PrimaryAddress};
也可用于调用值类型的默认构造函数:
int i= new int();
上一句等同于 int i=0;因为0是int类型的默认值。
注意:不能为结构声明默认的构造函数,因为每一个值类型都隐式具有一个默认的公共构造函数,可以在结构类型上声明参数化构造函数已设置其初始值,但是,只有在需要默认值之外的值的时候才必须这样做。值类型对象(例如结构)是在堆栈上创建的,而引用类型(例如类)是在堆上创建的。基于值类型的对象是在超出范围时销毁的,而基于引用类型的对象则是在该对象的最后一个引用被移除之后的某个不确定的时间销毁的。
2.new做修饰符使用。
new关键字可以显示隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生类版本将替换基类版本,在不使用new关键字隐藏成员时会产生警告,在使用了new关键字后可以消除该警告,并记录要替换成派生版本这一事实。
若要隐藏继承的成员,应使用相同名称在派生类中声明该成员,并使用new修饰符修饰该成员,例如:使用DerivedC.Invoke()隐藏了BaseC.Invoke()
public class BaseC { public int x; public void Invoke(){}; } public class DerivedC :BaseC { new public void Invoke(){}; }
通过继承隐藏名称的常用形式有:
@.引入类或结构中的常数,指定,属性或类型隐藏具有相同名称的所有基类成员。
@.引入类或结构中的方法隐藏基类中具有相同名称的属性,字段和类型。同时也隐藏具有相同签名的所有基类方法。
@.引入类或结构中的索引器将隐藏具有相同签名的所有基类索引器。
不能同时对一个成员使用new和override,因为这两个修饰符含义互斥,new修饰符会用同样的名称创建一个新成员并隐藏原始成员。override修饰符将会扩展继承成员的实现。
3.new约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。如果使用new约束,则该类型不能为抽象类型。
当泛型类创建类型的新实例,将new约束应用于类型参数,例如:
class ItemFactory<T> where T :new() { public T GetNewItem() { return new T(); }}
当与其它约束一起使用时,new()约束必须最后指定,例如:
public class ItemFactory2<T> where T :IComparable,new() {}