C#属性声明中的“ new”关键字


71

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

public new string navUrl
{
  get 
  {
    return ...;
  }
  set
  {
    ...
  }
}

我想知道new修改器对属性有何作用?

Answers:


61

它隐藏了基类的navUrl属性。参见新的Modifier。如该MSDN条目中所述,您可以使用完全限定的名称来访问“隐藏”属性:BaseClass.navUrl。滥用其中任何一个都可能导致巨大的混乱和可能的精神错乱(即代码破损)。


15
new修改不会导致这种行为,它只是告诉你这样做是故意的编译器,所以它不会显示一个警告消息。
BornToCode 2014年

15

new 隐藏财产。

您的代码中可能是这样的:

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

class derived : base1
{
    public new string navUrl
    {
        get;
        set;
    }
}

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


如果我使用new名称相同但类型不同的关键字会出现问题吗?
Beyondo

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.

3
您的代码段很好地阐明了隐藏概念,但是new修饰符不会导致此行为,它只会告诉编译器您有意进行此操作,因此不会显示警告消息。
BornToCode 2014年

那是什么导致这种现象呢?通常A.WorkProperty会调用派生类的属性,因为A引用派生对象,而不管引用类型如何。
Squirrelkiller


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.