2010-09-06 67 views
54

我已經被賦予了一個.net項目來維護。我只是通過代碼瀏覽,我注意到這對財產申報:在c#屬性聲明中的「新」關鍵字

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

我想知道什麼是new修改做房地產?

回答

47

它隱藏了基類的navUrl屬性。見new Modifier。正如在MSDN條目中提到的那樣,您可以使用完全限定名稱訪問「隱藏」屬性:BaseClass.navUrl。濫用任何一方都可能導致大量混淆和可能的瘋狂(即破碼)。

+8

的'new'修改不會導致此行爲,它只會告訴編譯器你故意這麼做,所以它不會顯示警告消息。 – BornToCode 2014-03-25 17:46:04

8

new正在隱藏該物業。

它可能是這樣的代碼:

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

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

在這裏,在派生類中,navUrl屬性隱藏基類屬性。

3

這也記錄在here

來自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. 
+2

您的代碼片段很好地闡明瞭隱藏的概念,但是'new'修飾符不會導致這種行爲,它只會告訴編譯器您有意識地這樣做,因此它不會顯示警告消息。 – BornToCode 2014-03-25 17:45:32

+0

那麼是什麼導致了這種行爲?通常A.WorkProperty會調用派生類的屬性,因爲A引用派生對象,而不管引用類型如何。 – Squirrelkiller 2016-09-07 09:20:52