修饰符
在 C# 中,new
关键字作为修饰符时,主要用于隐藏基类中的成员(如方法、属性、字段等)。当派生类中定义了一个与基类中同名的成员时,使用 new
关键字可以显式地隐藏基类中的成员,从而避免编译器的警告。
示例代码
class A
{
public virtual void Display()
{
Console.WriteLine("Method in class A");
}
}
class B : A
{
public new void Display()
{
Console.WriteLine("Method in class B");
}
}
class A
{
public A(int x)
{
// Constructor in class A
}
}
class B : A
{
public B(int x, int y) : base(x)
{
// Constructor in class B
}
public new B(int x) : base(x)
{
// Another constructor in class B
}
}
new
关键字仅用于隐藏基类中的成员,并不会影响多态性。即使使用了new
关键字,通过基类引用调用该成员时,仍然会调用基类中的实现。- 如果需要实现多态性,应使用
override
关键字来重写基类中的虚方法或抽象方法。
使用 new 关键字的场景
当派生类中定义了一个与基类中同名的成员时,如果不使用 new
关键字,编译器会发出警告,提示基类中的成员被隐藏。使用 new
关键字可以明确表示这是有意为之,从而消除警告。
与 override 的区别
new
关键字用于隐藏基类中的成员,而override
关键字用于重写基类中的虚方法或抽象方法。- 使用
new
关键字时,通过基类引用调用该成员时,仍然会调用基类中的实现;而使用override
关键字时,通过基类引用调用该成员时,会调用派生类中的实现。
总结
new
关键字作为修饰符在 C# 中用于隐藏基类中的成员,避免编译器的警告。它不会影响多态性,通过基类引用调用该成员时,仍然会调用基类中的实现。如果需要实现多态性,应使用 override
关键字。
运算符
new 关键字用于创建类的实例(对象)。
MyClass obj = new MyClass(); // 创建 MyClass 类的一个实例
泛型声明中约束
在泛型声明中用作约束,用于指定泛型类型参数必须具有公共的无参数构造函数。
public class MyClass<T> where T : new()
{
public T CreateInstance()
{
return new T();
}
}
在这个示例中,MyClass<T> 是一个泛型类,where T : new() 是约束语法,表示泛型类型 T 必须具有无参数的公共构造函数。因此,在 MyClass<T> 中的 CreateInstance 方法可以创建 T 类型的实例,因为在该方法内部使用了 new T() 来调用 T 类型的无参数构造函数。
这种约束确保了泛型类型参数 T 具有默认的无参数构造函数,以便在泛型类或方法内部创建该类型的实例。这样的约束对于需要在泛型中创建类型实例的情况非常有用。