在属性类名称之前的C#中使用了什么是new关键字?

时间:2018-01-10 11:22:37

标签: c# class attributes new-operator

在属性类名称之前使用C#new关键字的目的是什么?

我正在使用Rider,它建议在属性名称之前放置一个新关键字。

public class MyClass
{
   new AttributeClass attribute;

   ...    
}

3 个答案:

答案 0 :(得分:2)

As explained in documentation

  

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

属性上的

new关键字将允许您覆盖它的类型。当被视为基类型时,对象将不知道它。它还可以在基本类型和同一对象实例的派生类型中具有不同的值。有人说,这可能会导致一些非常混乱的错误。

考虑这个例子:

class Super
{
    int Id;
}

class Sub : Super
{
    new string Id;
}

static class Another
{
    static void AssignId(Super test, int val)
    {
        test.Id = val;
    }

    static Super ShowId(Super test)
    {
        return test.Id;
    }
}

...

var test = new Sub
{
    Id = "SUB123"
};

Another.AssignId(test, 123);
Console.WriteLine(Another.ShowId(test)); // 123
Console.WriteLine(test.Id); // SUB123

答案 1 :(得分:2)

其他海报已经解释了关键字的含义。

问题并非100%明确,但操作可能已经在询问为什么会在这个特定情况下提出建议。

重构工具会建议您在检测到您在派生类中实现了与基类中的虚拟成员同名的成员时使用new关键字。

当发生这种情况时,你有一些选择。

如果要扩展基类功能,请使用override关键字。

或者,如果要完全替换基本实现,请使用new关键字。

或者,如果命名冲突只是一个共同发生,则重命名派生类中的成员。

我删除了这篇帖子然后取消删除它,因为如果问题甚至对所提供的信息负责,我无法下定决心。我假设op在谈论在声明派生类型的成员时提示使用new关键字。如果他们试图在不使用new关键字的情况下实例化引用类型,则会出现编译器错误;不是建议......但是再一次从给出的例子中知道。

答案 2 :(得分:0)

从基类替换可覆盖属性时,将使用类属性上的new关键字。

E.g。

void Main()
{
    var objA = new Base {
        Prop = "test"
    };

    var objB = new Derived {
        Prop = 42
    };
}
public class Base
{
    public virtual string Prop { get; set; }
}
public class Derived : Base
{
    public new int Prop { get; set; }
}

Read more...