跳到主要内容

C# new 关键字用法

参考答案:

在C#中,new关键字有多种用法,但最常见的用途是创建对象的实例和隐藏继承的成员。以下是new关键字的主要用法:

  1. 创建对象实例: 使用new关键字和类的构造函数来创建该类的新实例。
class MyClass
{
    public int MyProperty { get; set; }
    public MyClass(int value)
    {
        MyProperty = value;
    }
}

class Program
{
    static void Main()
    {
        MyClass obj = new MyClass(42); // 使用new创建MyClass的新实例
        Console.WriteLine(obj.MyProperty); // 输出: 42
    }
}
  1. 作为运算符重载: 虽然不常见,但new可以作为运算符被重载,用于自定义对象的创建过程。这通常在实现特殊的资源分配或对象初始化逻辑时使用。
public class MyCustomClass
{
    // ... 其他成员 ...

    // new运算符的重载
    public static MyCustomClass operator new(int value)
    {
        MyCustomClass instance = new MyCustomClass();
        // 自定义初始化逻辑
        instance.SomeProperty = value;
        return instance;
    }
}

// 使用重载的new运算符创建MyCustomClass的实例
MyCustomClass customObj = new MyCustomClass(100); // 调用重载的new运算符
  1. 在继承中隐藏成员: 如果子类想要隐藏从基类继承的成员(方法、属性、事件或索引器),它可以使用new关键字。这通常用于提供与基类成员具有相同名称但功能不同的成员。
class BaseClass
{
    public void MyMethod() { Console.WriteLine("BaseClass.MyMethod"); }
}

class DerivedClass : BaseClass
{
    // 隐藏基类的MyMethod方法
    public new void MyMethod() { Console.WriteLine("DerivedClass.MyMethod"); }
}

class Program
{
    static void Main()
    {
        DerivedClass derived = new DerivedClass();
        derived.MyMethod(); // 输出: DerivedClass.MyMethod
        BaseClass baseObj = derived; // 引用转换
        baseObj.MyMethod(); // 输出: BaseClass.MyMethod,因为引用的是基类部分
    }
}

在上面的例子中,DerivedClass使用new关键字隐藏了从BaseClass继承的MyMethod方法。然而,如果通过一个基类引用调用该方法,则仍然会执行基类的版本。

请注意,虽然使用new来隐藏继承的成员在技术上是可能的,但这通常不是最佳实践,因为它可能导致代码难以理解和维护。更好的做法是使用不同的方法名或明确指定你想要调用哪个版本的方法(通过引用转换或显式调用基类方法)。