2010-09-06 11 views
54

Me ha proporcionado un proyecto .net para mantener. Estaba navegando a través del código y me di cuenta de esto en una declaración de propiedad:palabra clave "nueva" en declaración de propiedad en C#

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

Me preguntaba lo que hace el modificador new hacer a la propiedad?

Respuesta

47

Oculta la propiedad navUrl de la clase base. Ver new Modifier. Como se menciona en esa entrada de MSDN, puede acceder a la propiedad "oculto" con los nombres completos: BaseClass.navUrl. El abuso de cualquiera de ellos puede provocar una confusión masiva y una posible locura (es decir, código roto).

+8

El modificador 'new' no causa este comportamiento, solo le dice al compilador que lo hizo intencionalmente para que no muestre un mensaje de advertencia. – BornToCode

8

new está ocultando la propiedad.

Podría ser como esto en su código:

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

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

Aquí en la clase derivada, la propiedad navUrl se esconde la propiedad de la clase base.

3

Algunas veces se conoce como Shadowing o method hiding; El método llamado depende del tipo de referencia en el punto en que se realiza la llamada. This might ayuda.

3

Esto también está documentado here.

Fragmento de código de 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

Su fragmento de código aclara bien el concepto de ocultación, sin embargo, el modificador 'nuevo' no causa este comportamiento, solo le dice al compilador que lo hizo intencionadamente para que no muestre un mensaje de advertencia. – BornToCode

+0

Entonces, ¿qué causa este comportamiento? Por lo general, A.WorkProperty llamaría a la propiedad de la clase derivada, ya que A hace referencia a un objeto derivado, independientemente del tipo de referencias. – Squirrelkiller

Cuestiones relacionadas