📜  c# new 关键字 - C# (1)

📅  最后修改于: 2023-12-03 15:13:49.382000             🧑  作者: Mango

C# 中的 New 关键字

在 C# 中,new 关键字有两种使用方式:

  1. 在类中定义新的实例或静态成员。
  2. 在继承中隐藏父类成员。
定义新成员

使用 new 关键字,可以在类中定义新的实例或静态成员。它可以用在字段、属性、方法等成员声明中。

示例
class MyClass
{
    public int MyField = 1;

    public void MyMethod() 
    {
        Console.WriteLine("MyMethod in MyClass");
    }
}

class MyDerivedClass : MyClass
{
    public new int MyField = 2;

    public new void MyMethod()
    {
        Console.WriteLine("MyMethod in MyDerivedClass");
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyDerivedClass obj = new MyDerivedClass();
        Console.WriteLine(obj.MyField);  // 输出 2
        obj.MyMethod();  // 输出 "MyMethod in MyDerivedClass"
        ((MyClass)obj).MyMethod();  // 输出 "MyMethod in MyClass"
    }
}

上面的例子中,MyDerivedClass 继承自 MyClass。在 MyDerivedClass 中,重载了 MyFieldMyMethod

  • MyField 的类型是 new int,它会隐藏来自基类的字段 MyField
  • MyMethod 的类型是 new void,它会隐藏来自基类的方法 MyMethod

在 Main 方法中创建了 MyDerivedClass 的实例,并通过对象引用调用了 MyFieldMyMethod。由于 MyFieldMyMethod 都是被隐藏了,在 MyDerivedClass 中定义的 MyFieldMyMethod 将会被调用。

隐藏父类成员

使用 new 关键字,可以在子类中隐藏父类中的成员。它允许在子类中声明与父类中同名的方法、属性或字段,从而隐藏来自父类的成员。

示例
class MyClass
{
    public void MyMethod() 
    {
        Console.WriteLine("MyMethod in MyClass");
    }
}

class MyDerivedClass : MyClass
{
    public new void MyMethod()
    {
        Console.WriteLine("MyMethod in MyDerivedClass");
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyDerivedClass obj = new MyDerivedClass();
        obj.MyMethod();  // 输出 "MyMethod in MyDerivedClass"
        ((MyClass)obj).MyMethod();  // 输出 "MyMethod in MyClass"
    }
}

上面的例子中,MyDerivedClass 继承自 MyClass。在 MyDerivedClass 中,定义了一个与 MyClass 同名的方法 MyMethod,它将隐藏父类中的方法。

在 Main 方法中创建了 MyDerivedClass 的实例,并通过对象引用调用了 MyMethod。由于 MyMethodMyDerivedClass 中被隐藏了,在 MyDerivedClass 中定义的 MyMethod 将会被调用。使用主动转换,还可以访问基类中的成员。