【问题标题】:"new" keyword in property declaration in c#c# 属性声明中的“new”关键字
【发布时间】:2010-09-06 05:19:01
【问题描述】:

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

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

我想知道new 修饰符对属性有什么作用?

【问题讨论】:

    标签: c# .net asp.net


    【解决方案1】:

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

    【讨论】:

    • new 修饰符不会导致这种行为,它只会告诉编译器你是故意这样做的,所以它不会显示警告消息。
    【解决方案2】:

    new 正在隐藏该属性。

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

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

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

    【讨论】:

    • 如果我使用关键字new 同名但类型不同会不会有问题?
    【解决方案3】:

    这也记录在here

    来自 msdn 的代码 sn-p。

    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.
    

    【讨论】:

    • 您的代码 sn-p 很好地阐明了隐藏概念,但是 new 修饰符不会导致此行为,它只会告诉编译器您是故意这样做的,因此不会显示警告消息。
    • 那么是什么导致了这种行为呢?通常 A.WorkProperty 会调用派生类的属性,因为 A 引用派生对象,而与引用类型无关。
    【解决方案4】:

    有时称为Shadowingmethod hiding;调用的方法取决于调用点的引用类型。 This might帮助。

    【讨论】:

      【解决方案5】:

      https://msdn.microsoft.com/en-us/library/435f1dw2.aspx

      看看这里的第一个例子,它很好地说明了如何使用new 关键字来屏蔽基类变量

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2013-03-11
        • 1970-01-01
        • 2012-10-21
        • 2014-05-17
        • 1970-01-01
        相关资源
        最近更新 更多