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

问题描述 投票:-2回答:3

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

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

public class MyClass
{
   new AttributeClass attribute;

   ...    
}
c# class attributes new-operator
3个回答
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

2
投票

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

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

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

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

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

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

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

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


0
投票

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

EG

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...

© www.soinside.com 2019 - 2024. All rights reserved.