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.

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).


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.


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.

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.