2016-05-23 5 views
7

Ich habe eine Eigenschaft, die derzeit automatisch ist.Getter ohne Körper, Setter mit

public string MyProperty { get; set; } 

aber ich brauche es jetzt einige Aktion jedes Mal, es ändert auszuführen, so möchte ich Logik der Setter hinzuzufügen. Deshalb möchte ich etwas tun:

public string MyProperty { 
    get; 
    set { PerformSomeAction(); } 
} 

Dies ist jedoch nicht bauen ... MyProperty.get' must declare a body because it is not marked abstract, extern, or partial

Ich kann nicht einfach haben die Getter Rückkehr MyProperty, wie es zu einer Endlosschleife führen wird.

Gibt es eine Möglichkeit, dies zu tun, oder muss ich eine private Variable angeben, auf die verwiesen wird? Ich möchte lieber nicht als MyProperty sowohl in dieser Klasse aus dem Code verwendet, um durch und außerhalb

Antwort

8

Sie benötigen eine Eigenschaft mit Unterstützung Feld verwenden:

private string mMyProperty; 
public string MyProperty 
{ 
    get { return mMyProperty; } 
    set 
    { 
     mMyProperty = value; 
     PerformSomeAction(); 
    } 
} 
+2

Das ist traurig, nicht wahr? Ich meine, warum würden sie etwas wie 'string myStr {get; privates Set; } 'aber nicht' {bekommen; setze {...}} '. – Parziphal

2

Sie kann nicht ohne das andere implementieren Wie bei der Verwendung der einen verweist sie auf ein (verborgenes) Hintergrundfeld, das im Falle einer automatisch generierten Eigenschaft automatisch erzeugt wird. Wenn Sie jedoch eines implementieren, müssen Sie dieses Hintergrundfeld auf beide Arten festlegen.

Der Auto-Weg ist nur eine Abkürzung für diesen:

private string _property; 
public string MyProperty 
{ 
    get { return _property; } 
    set { _property = value; } 
} 

Also, wenn ich würde das versteckte Feld in eines des Verfahren weglassen (das ist, was Getter und Setter tatsächlich sind), wie sollte diese Methode wissen, wie man den Wert speichert/bekommt?

0

Wenn Sie etwas im Setter tun, müssen Sie die Variable explizit deklarieren. Z.B.

private string _myProperty; 
public string MyProperty { 
    get { return _myProperty; }; 
    set 
    { 
     _myProperty = value; 
     PerformSomeAction(); 
    } 
} 

oder - in der Setter können Sie Wert auf die Funktion übergeben und das tun, was Sie da es wünschen ... vorausgesetzt, Sie ändern möchten/prüfen Sie den Wert in der Funktion PerformSomeAction()

1

Sie müssen stellen entweder einen Körper für den Getter und den Setter oder keinen von beiden zur Verfügung.

Wenn Sie also eines definieren, ist es keine automatische Eigenschaft mehr.

So müssen Sie tun:

Entweder

public string MyProperty { 
    get; 
    set; 
}// Automatic property, no implementation 

ODER

public string MyProperty 
{ 
    get { return mMyProperty; } 
    set 
    { 
     mMyProperty = value; 
     PerformSomeAction(); 
    } 
} 
0

Dies ist vergleichbar mit der Frage C# getter and setter shorthand.

Wenn Sie einen Setter manuell angeben, wird der automatische Eigenschaftsmechanismus für den Getter nicht verwendet. Daher verhält sich die Fehlermeldung so, als ob sie fehlt. Sie müssen Ihren eigenen Getter schreiben, wenn Sie den Setter angeben.