在方法签名的新关键字在方法签名的新关键字(new keyword in method signatu

2019-05-13 13:00发布

在执行一个重构,我结束了创建如下例所示的方法。 数据类型已更改为简单起见。

我以前有过这样的赋值语句:

MyObject myVar = new MyObject();

它是重构这一意外:

private static new MyObject CreateSomething()
{
  return new MyObject{"Something New"};
}

这是我的一个剪切/粘贴错误的结果,但new的关键字private static new有效和编译。

:什么是new关键字的方法签名意味着什么? 我认为这件事情的介绍了C#3.0?

这是如何从不同的override

Answer 1:

从MSDN新的关键字参考:

MSDN参考

下面是我从微软的MVP网,取得了良好的感觉找到了一个例子: 链接到原始

public class A
{
   public virtual void One();
   public void Two();
}

public class B : A
{
   public override void One();
   public new void Two();
}

B b = new B();
A a = b as A;

a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B

覆盖只能在非常特殊的情况下使用。 从MSDN:

你不能忽略非虚拟或静态方法。 所述重写的基方法必须是虚拟的,抽象的,或覆盖。

因此,需要在“新”的关键字,让你“覆盖”非虚拟和静态方法。



Answer 2:

不,它实际上不是“新”(原谅双关语)。 它基本上用于“藏”的方法。 IE:

public class Base
{
   public virtual void Method(){}
}

public class Derived : Base
{
   public new void Method(){}
}

如果你再这样做:

Base b = new Derived();
b.Method();

在基本的方法是一个将被调用,而不是一个在派生。

一些更多的信息: http://www.akadia.com/services/dotnet_polymorphism.html

回复您的编辑:在这个例子中,我给了,如果你是来“覆盖”,而不是使用“新”,那么当你调用弘(); 派生类的方法会因为多态性的调用。



Answer 3:

正如其他人所解释的,它是用来隐藏现有方法。 它是用于覆盖不是在父类中的虚拟的方法是有用的。

请记住,创造一个“新”成员不是多态。 如果你投的对象为基本类型,它不会使用派生类型的成员。

如果你有一个基类:

public class BaseClass
{
    public void DoSomething() { }
}

然后派生类:

public class DerivedType : BaseClass
{
    public new void DoSomething() {}

}

如果声明的类型DerivedType然后抹上它,方法DoSomething()是不是多态的,它会调用基类的方法,而不是得到的一个。

BaseClass t = new DerivedType();
t.DoSomething();// Calls the "DoSomething()" method of the base class.


Answer 4:

从文档:

如果在派生类的方法的前面有新的关键字,则该方法被定义为独立的基类的方法的。

这是什么在实践中意味着:

如果你从另一个类继承,你必须共享,你可以把它定义为“新”相同签名的方法,使其独立于父类。 这意味着,如果你在“父”类的引用,那么此实现将被执行,如果你有孩子类,则该实现将执行的参考。

我个人尽量避免“新”的关键字,因为它通常意味着我有我的类层次结构错,但有些时候,它可能是有用的。 一个地方是对版本和向后兼容性。

有大量的信息在MSDN此 。



Answer 5:

这意味着该方法取代由基类继承相同名称的方法。 在你的情况,你可能没有该名称的方法在基类,这意味着新的关键字是完全多余的。



Answer 6:

长话短说-它不是必需的,它改变NO行为,纯粹是为有可读性。

这就是为什么在VS,你会看到一个小波浪,但你的代码将编译和运行完全正常,并符合市场预期。

人们想知道,如果这是真的值得创建new的时候它的意思是开发人员的承认“是的,我知道我躲在一个基础方法的关键字,是的,我知道我没有做任何事情涉及到virtualoverriden (多态性) - 我真的只想创建它自己的方法”。

这是一个有点匪夷所思给我,但也许只是因为我来自一个Java背景和有之间的根本区别C#继承和Java :在Java ,除非通过特定的方法是通过默认虚拟final 。 在C#方法除非指定默认最终/混凝土virtual



Answer 7:

从MSDN :

使用new修饰符显式隐藏从基类继承的成员。 要隐藏继承成员,声明它使用相同的名称派生类,并用new修饰符修改它。



Answer 8:

小心这个疑难杂症的。
你必须在在碱类实现的接口中定义的方法。 然后创建一个派生类隐藏了接口的方法,但不明确声明派生类为实现该接口。 如果然后通过该界面的参考调用该方法,基类的方法将被调用。 但是,如果你的派生类不具体实现接口,那么它的方法将被调用,无论采用何种的引用类型。

interface IMethodToHide
{
    string MethodToHide();
}

class BaseWithMethodToHide : IMethodToHide
{
    public string MethodToHide()
    {
        return "BaseWithMethodToHide";
    }
}

class DerivedNotImplementingInterface   : BaseWithMethodToHide
{
    new public string MethodToHide()
    {
        return "DerivedNotImplementingInterface";
    }
}

class DerivedImplementingInterface : BaseWithMethodToHide, IMethodToHide
{
    new public string MethodToHide()
    {
        return "DerivedImplementingInterface";
    }
}

class Program
{
    static void Main()
    {
        var oNoI = new DerivedNotImplementingInterface();
        IMethodToHide ioNoI = new DerivedNotImplementingInterface();

        Console.WriteLine("reference to the object type DerivedNotImplementingInterface calls the method in the class " 
            + oNoI.MethodToHide());
        // calls DerivedNotImplementingInterface.MethodToHide()
        Console.WriteLine("reference to a DerivedNotImplementingInterface object via the interfce IMethodToHide calls the method in the class " 
            + ioNoI.MethodToHide());
        // calls BaseWithMethodToHide.MethodToHide()
        Console.ReadLine();

        var oI = new DerivedImplementingInterface();
        IMethodToHide ioI = new DerivedImplementingInterface();

        Console.WriteLine("reference to the object type DerivedImplementingInterface calls the method in the class " 
            + oI.MethodToHide());
        // calls DerivedImplementingInterface.MethodToHide()
        Console.WriteLine("reference to a DerivedImplementingInterface object via the interfce IMethodToHide calls the method in the class " 
            + ioI.MethodToHide());
        // calls DerivedImplementingInterface.MethodToHide()
        Console.ReadLine();

    }
}


文章来源: new keyword in method signature