【发布时间】:2010-09-06 05:19:01
【问题描述】:
我得到了一个 .NET 项目来维护。我只是在浏览代码,并在属性声明中注意到了这一点:
public new string navUrl
{
get
{
return ...;
}
set
{
...
}
}
我想知道new 修饰符对属性有什么作用?
【问题讨论】:
我得到了一个 .NET 项目来维护。我只是在浏览代码,并在属性声明中注意到了这一点:
public new string navUrl
{
get
{
return ...;
}
set
{
...
}
}
我想知道new 修饰符对属性有什么作用?
【问题讨论】:
它隐藏了基类的 navUrl 属性。见new Modifier。如该 MSDN 条目中所述,您可以使用完全限定名称访问“隐藏”属性:BaseClass.navUrl。滥用其中任何一个都可能导致严重的混乱和可能的精神错乱(即代码损坏)。
【讨论】:
new 修饰符不会导致这种行为,它只会告诉编译器你是故意这样做的,所以它不会显示警告消息。
new 正在隐藏该属性。
在你的代码中可能是这样的:
class base1
{
public virtual string navUrl
{
get;
set;
}
}
class derived : base1
{
public new string navUrl
{
get;
set;
}
}
在派生类中,navUrl 属性隐藏了基类属性。
【讨论】:
new 同名但类型不同会不会有问题?
这也记录在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.
【讨论】:
new 修饰符不会导致此行为,它只会告诉编译器您是故意这样做的,因此不会显示警告消息。
有时称为Shadowing 或method hiding;调用的方法取决于调用点的引用类型。 This might帮助。
【讨论】:
https://msdn.microsoft.com/en-us/library/435f1dw2.aspx
看看这里的第一个例子,它很好地说明了如何使用new 关键字来屏蔽基类变量
【讨论】: