Schlüsselwort "new" in der Eigenschaftsdeklaration in c #

71

Ich habe ein .net-Projekt zur Wartung erhalten. Ich habe gerade den Code durchgesehen und dies bei einer Eigenschaftserklärung festgestellt:

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

Ich habe mich gefragt, was der newModifikator mit der Eigenschaft macht.

Ben Rowe
quelle

Antworten:

61

Es verbirgt die navUrl-Eigenschaft der Basisklasse. Siehe neuen Modifikator . Wie in diesem MSDN-Eintrag erwähnt, können Sie auf die "versteckte" Eigenschaft mit vollständig qualifizierten Namen zugreifen : BaseClass.navUrl. Der Missbrauch von beidem kann zu massiver Verwirrung und möglichem Wahnsinn führen (dh gebrochener Code).

rostig
quelle
15
Der newModifikator verursacht dieses Verhalten nicht, sondern teilt dem Compiler nur mit, dass Sie es absichtlich getan haben, sodass keine Warnmeldung angezeigt wird.
BornToCode
15

new versteckt das Eigentum.

In Ihrem Code könnte dies folgendermaßen aussehen:

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

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

Hier in der abgeleiteten Klasse navUrlversteckt die Eigenschaft die Basisklasseneigenschaft.

anishMarokey
quelle
Wäre es ein Problem, wenn ich das Schlüsselwort newmit demselben Namen, aber mit einem anderen Typ verwenden würde?
Beyondo
6

Dies ist auch hier dokumentiert .

Code-Snippet von 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.
Santhosh
quelle
3
Ihr Code-Snippet verdeutlicht das Versteckkonzept gut. Der newModifikator verursacht dieses Verhalten jedoch nicht. Er teilt dem Compiler nur mit, dass Sie es absichtlich getan haben, sodass keine Warnmeldung angezeigt wird.
BornToCode
Was verursacht dann dieses Verhalten? Normalerweise ruft A.WorkProperty die Eigenschaft der abgeleiteten Klasse auf, da A unabhängig vom Referenztyp auf ein abgeleitetes Objekt verweist.
Squirrelkiller
3

Einige Male als Shadowingoder Methode versteckt bezeichnet ; Die aufgerufene Methode hängt von der Art der Referenz zum Zeitpunkt des Aufrufs ab. Dies könnte helfen.

KMån
quelle