c#中属性声明中的"new"关键字

Ben*_*owe 68 .net c# asp.net

我已经获得了一个.net项目来维护.我只是浏览代码,我在一个属性声明中注意到了这一点:

public new string navUrl
{
  get 
  {
    return ...;
  }
  set
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我想知道new修饰符对属性做了什么?

Rus*_*sty 60

它隐藏了基类的navUrl属性.请参阅新的修改器.如MSDN条目中所述,您可以使用完全限定名称访问"hidden"属性:BaseClass.navUrl.滥用任何一种都可能导致大量混乱和可能的疯狂(即破坏代码).

  • `new`修饰符不会导致此行为,它只会告诉编译器您是故意这样做的,因此它不会显示警告消息. (14认同)

ani*_*key 14

new 正在隐藏财产.

在你的代码中可能是这样的:

class base1
{
    public virtual string navUrl
    {
        get;
        set;
    }
}

class derived : base1
{
    public new string navUrl
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

在派生类中,该navUrl属性隐藏了基类属性.


San*_*osh 6

这也记录在这里.

来自msdn的代码片段.

public class BaseClass
{
    public void DoWork() { }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}    

DerivedClass B = new DerivedClass();
B.WorkProperty;  // Calls the new property.

BaseClass A = (BaseClass)B;
A.WorkProperty;  // Calls the old property.
Run Code Online (Sandbox Code Playgroud)

  • 您的代码片段很好地阐明了隐藏概念,但是`new`修饰符不会导致此行为,它只会告诉编译器您是故意这样做的,因此它不会显示警告消息. (2认同)