In seinem ausgezeichneten Buch CLR Via C # sagte Jeffrey Richter, dass er Immobilien nicht mag und empfiehlt, sie nicht zu verwenden. Er gab einen Grund an, aber ich verstehe nicht wirklich. Kann mir jemand erklären, warum ich Eigenschaften verwenden sollte oder nicht? Ändert sich dies in C # 3.0 mit automatischen Eigenschaften?
Als Referenz habe ich Jeffrey Richters Meinungen hinzugefügt:
• Eine Eigenschaft kann schreibgeschützt oder schreibgeschützt sein. Der Feldzugriff ist immer lesbar und beschreibbar. Wenn Sie eine Eigenschaft definieren, ist es am besten, Accessor-Methoden zum Abrufen und Festlegen anzubieten.
• Eine Eigenschaftsmethode kann eine Ausnahme auslösen. Der Feldzugriff löst niemals eine Ausnahme aus.
• Eine Eigenschaft kann nicht als out- oder ref-Parameter an eine Methode übergeben werden. ein Feld kann. Der folgende Code wird beispielsweise nicht kompiliert:
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
• Die Ausführung einer Eigenschaftsmethode kann lange dauern. Der Feldzugriff wird immer sofort abgeschlossen. Ein häufiger Grund für die Verwendung von Eigenschaften ist die Durchführung einer Thread-Synchronisierung, die den Thread für immer stoppen kann. Daher sollte eine Eigenschaft nicht verwendet werden, wenn eine Thread-Synchronisierung erforderlich ist. In dieser Situation wird ein Verfahren bevorzugt. Wenn auf Ihre Klasse remote zugegriffen werden kann (z. B. wird Ihre Klasse von System.MashalByRefObject abgeleitet), ist der Aufruf der Eigenschaftsmethode sehr langsam. Daher wird eine Methode einer Eigenschaft vorgezogen. Meiner Meinung nach sollten von MarshalByRefObject abgeleitete Klassen niemals Eigenschaften verwenden.
• Wenn eine Eigenschaftsmethode mehrmals hintereinander aufgerufen wird, kann sie jedes Mal einen anderen Wert zurückgeben. Ein Feld gibt jedes Mal den gleichen Wert zurück. Die System.DateTime-Klasse verfügt über eine schreibgeschützte Now-Eigenschaft, die das aktuelle Datum und die aktuelle Uhrzeit zurückgibt. Jedes Mal, wenn Sie diese Eigenschaft abfragen, wird ein anderer Wert zurückgegeben. Dies ist ein Fehler, und Microsoft wünscht sich, dass die Klasse behoben werden kann, indem Now anstelle einer Eigenschaft zu einer Methode gemacht wird.
• Eine Eigenschaftsmethode kann beobachtbare Nebenwirkungen verursachen. Feldzugriff nie. Mit anderen Worten, ein Benutzer eines Typs sollte in der Lage sein, verschiedene von einem Typ definierte Eigenschaften in beliebiger Reihenfolge festzulegen, ohne ein anderes Verhalten des Typs zu bemerken.
• Eine Eigenschaftsmethode erfordert möglicherweise zusätzlichen Speicher oder gibt einen Verweis auf etwas zurück, das nicht Teil des Objektstatus ist. Das Ändern des zurückgegebenen Objekts hat daher keine Auswirkungen auf das ursprüngliche Objekt. Das Abfragen eines Feldes gibt immer einen Verweis auf ein Objekt zurück, das garantiert Teil des ursprünglichen Objektstatus ist. Das Arbeiten mit einer Eigenschaft, die eine Kopie zurückgibt, kann für Entwickler sehr verwirrend sein, und diese Eigenschaft wird häufig nicht dokumentiert.