关于C#中的新修饰符

时间:2014-01-23 17:43:08

标签: c# operator-keyword

我不太了解C#中的修饰符new:根据new修饰符的存在,下面的代码会有哪些不同?

class A 
    {
        public void F() { Console.WriteLine("A::F()"); }
    }


class B : A
    {
    public new void F() { Console.WriteLine("B::F()"); }

    public static void Main()
    {
        A a = new B();
        B b = new B();
        A trueA = new A();
        a.F();
        b.F();
        trueA.F();
        Console.ReadLine();
    }
}

C ++中有没有相同或类似的东西?

2 个答案:

答案 0 :(得分:4)

如果您在班级public void F()中使用public new void F()B,结果会相同。该方法仍将被遮蔽。

不同之处在于,如果省略new修饰符,则会收到编译器警告,因为代码可能会引起混淆。 new修饰符用于指定您实际上要从基类中隐藏成员,并且不会恰巧错误地使用相同的名称。

答案 1 :(得分:0)

如果您在基类中定义了virtual方法,您会看到差异。 override修饰符扩展了基类方法,new修饰符通过创建一个与基类上的方法无关的新方法来隐藏它。 试试下一个代码:

class Program
{
 class A
 {
   public virtual void F() { Console.WriteLine("A::F()"); }
   public virtual void G() { Console.WriteLine("A::G()"); }
 }


class B : A
{
  public override void F() { Console.WriteLine("B::F()"); }
  public new void G() { Console.WriteLine("B::G()"); }

  public static void Main()
  {
    A a = new B();
    B b = new B();
    a.F();
    b.F();
    a.G();
    b.G();

    Console.ReadLine();
  }
}

}

在C ++中,您可以通过在派生类上定义具有相同名称但不同参数的方法来隐藏基类的方法。也许你可以使用它。