2016-06-30 18 views
15

Was ist der Unterschied zwischen diesen beiden Eigenschaften Implementierungen?Leere Setter vs keine Setter in Eigenschaften

public override string A 
{ 
    get { return "s"; } 
    set { } 
} 

public override string A 
{ 
    get { return "s"; } 
} 
+14

Versuchen Sie 'A =" ";' und sehen Sie, was passiert. –

Antwort

22

Nun, da Aoverride als die Basisklasse muss haben beideget und set (sonst der Code kompiliert nicht) z

public class MyBase { 
    public virtual String A { 
    get { 
     return "getBaseA"; 
    } 
    set { 
     throw new NotSupportedException("setBaseA"); 
    } 
    } 
} 

Jetzt haben Sie zwei verschiedene abgeleitete Klassen:

public class MyDerivedA: MyBase { 
    public override String A { 
    get { 
     return "s"; 
    } 
    set { // set is overridden, now set does nothing 
    } 
    } 
} 

public class MyDerivedB: MyBase { 
    public override String A { 
    get { 
     return "s"; 
    } 
    // set is not overridden, same as in the base class 
    } 
} 

die beiden set Methoden Lassen Sie rufen:

// Does nothing: overridden MyDerivedA.A.set is called 
MyBase test1 = new MyDerivedA(); 
test1.A = "Sample"; 

// Will throw NotSupportedException (base MyBase.A.set is called) 
MyBase test2 = new MyDerivedB(); 
test2.A = "Sample"; 
+1

@CodesInChaos: Danke für den Hinweis! 'NotSupportedException' ist eigentlich eine bessere Wahl. –

6

Die erste wird den Setter für A in Basisklasse mit einer Methode überschreiben, die nichts zu tun ist. So können Sie A = "" haben, aber es tut nichts.

Die Methode, wenn Sie eine Setter definieren public override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { } und A = "" im zweiten Fall sein wird kompiliert, aber es wird die Basisklasse Setter für A nennen.

1

Erstens: Es gibt einen Setter, aber in diesem Setter wird nichts tun
Zweitens: Es gibt keine Setter

+0

Sicher gibt es, aber es ist leicht zu übersehen. In beiden Fällen gibt es einen Setter. Im ersten Fall wird der Basisklassensetzer außer Kraft gesetzt (um nichts zu tun), während im zweiten Fall der Basisklassensetzer geerbt wird (um zu tun, was auch immer implementiert wird). – Zano

4

Dieser Getter und Setter ist außer Kraft gesetzt. Dieser Code würde in beiden Fällen kompilieren, wenn x.A ="" getan wird. Im ersten Fall überschreiben wir die Eigenschaft set, was bedeutet, dass nichts passiert, wenn Sie versuchen, dem Objekt einen Wert zuzuweisen. Im zweiten Fall wird es Basisklassenimplementierung

2

Sie override verwenden verwenden, so nehme ich an der Klasse Ihres Fragment aus hat eine Basisklasse mit etwas ist wie

public virtual string A { get; set; } 

Wenn Sie nur den Getter außer Kraft setzen (Ihr zweites Beispiel), wird der ursprüngliche Setter weiterhin verwendet. Sie sehen das Ergebnis nicht, da es von Ihrer Überschreibung verdeckt wird.

Wenn Sie den Setter auch mit einer leeren Methode überschreiben, wird der Base Setter nicht aufgerufen.