Eigenschaftenentwurf

Hinweis

Diese Inhalte wurden mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines nachgedruckt: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Diese Ausgabe wurde 2008 veröffentlicht, und das Buch wurde seitdem in der dritten Ausgabe vollständig überarbeitet. Einige der Informationen auf dieser Seite sind möglicherweise veraltet.

Obwohl Eigenschaften Methoden technisch sehr ähnlich sind, unterscheiden sie sich in Bezug auf ihre Einsatzszenarien deutlich. Sie sollten als intelligente Felder betrachtet werden. Sie weisen die Aufrufsyntax von Feldern und die Flexibilität von Methoden auf.

✔️ Erstellen Sie „get-only“-Eigenschaften, wenn der Aufrufer den Wert der Eigenschaft nicht ändern können soll.

Beachten Sie, dass der Eigenschaftswert auch dann geändert werden kann, wenn die Eigenschaft „get-only“ ist, wenn der Typ der Eigenschaft ein veränderbarer Verweistyp ist.

❌ Stellen Sie KEINE „set-only“-Eigenschaften oder Eigenschaften bereit, bei denen der Setter einen breiteren Zugriff als der Getter besitzt.

Verwenden Sie z. B. keine Eigenschaften mit einem öffentlichen Setter und einem geschützten Getter.

Wenn der Eigenschaftengetter nicht bereitgestellt werden kann, implementieren Sie die Funktionalität stattdessen als Methode. Ziehen Sie in Betracht, den Methodennamen mit Set zu beginnen und dann Ihren eigenen Namen der Eigenschaft folgen zu lassen. AppDomain weist beispielsweise eine Methode mit dem Namen SetCachePath anstatt einer „set-only“-Eigenschaft namens CachePath auf.

✔️ Stellen Sie SINNVOLLE Standardwerte für alle Eigenschaften bereit, um sicherzustellen, dass die Standardwerte nicht zu einer Sicherheitslücke oder zu äußerst ineffizientem Code führen.

✔️ ERLAUBEN Sie, dass Eigenschaften in beliebiger Reihenfolge festgelegt werden, auch wenn dies zu einem vorübergehend ungültigen Zustand des Objekts führt.

Es ist nicht ungewöhnlich, dass zwei oder mehr Eigenschaften so miteinander verknüpft sind, dass einige Werte einer Eigenschaft angesichts der Werte anderer Eigenschaften desselben Objekts ungültig sein können. In solchen Fällen sollten Ausnahmen, die sich aus dem ungültigen Zustand ergeben, verschoben werden, bis die in Beziehung stehenden Eigenschaften tatsächlich gemeinsam vom Objekt verwendet werden.

✔️ BEHALTEN Sie den vorherigen Wert BEI, wenn ein Eigenschaftensetter eine Ausnahme auslöst.

❌ VERMEIDEN Sie das Auslösen von Ausnahmen aus Eigenschaftengettern.

Eigenschaftengetter sollten einfache Vorgänge sein und keine Vorbedingungen aufweisen. Wenn ein Getter eine Ausnahme auslösen kann, sollte er möglicherweise zu einer Methode umgestaltet werden. Beachten Sie, dass diese Regel nicht für Indexer gilt, bei denen Ausnahmen aufgrund der Validierung der Argumente erwartet werden.

Entwerfen indizierter Eigenschaften

Eine indizierte Eigenschaft ist eine besondere Eigenschaft, die über Parameter verfügen und mit spezieller Syntax ähnlich der Arrayindizierung aufgerufen werden kann.

Indizierte Eigenschaften werden im Allgemeinen als Indexer bezeichnet. Indexer sollten nur in APIs verwendet werden, die Zugriff auf Elemente in einer logischen Sammlung ermöglichen. Beispielsweise ist eine Zeichenfolge eine Sammlung von Zeichen, und der Indexer für System.String wurde hinzugefügt, um auf ihre Zeichen zuzugreifen.

✔️ ERWÄGEN Sie die Verwendung von Indexern, um den Zugriff auf Daten zu ermöglichen, die in einem internen Array gespeichert sind.

✔️ ERWÄGEN Sie die Bereitstellung von Indexern für Typen, die Sammlungen von Elementen darstellen.

❌ VERMEIDEN Sie die Verwendung indizierter Eigenschaften mit mehreren Parametern.

Wenn der Entwurf mehrere Parameter erfordert, überdenken Sie, ob die Eigenschaft tatsächlich einen Accessor für eine logische Sammlung darstellt. Wenn dies nicht der Fall ist, verwenden Sie stattdessen Methoden. Beginnen Sie den Methodennamen ggf. mit Get oder Set.

❌ VERMEIDEN Sie Indexer mit anderen Parametertypen als System.Int32, System.Int64, System.String, System.Object oder einer Enumeration.

Wenn der Entwurf andere Parametertypen erfordert, überdenken Sie unbedingt, ob die API tatsächlich einen Accessor für eine logische Sammlung darstellt. Wenn dies nicht der Fall ist, verwenden Sie eine Methode. Beginnen Sie den Methodennamen ggf. mit Get oder Set.

✔️ Verwenden Sie den Namen Item für indizierte Eigenschaften, es sei denn, es gibt einen offensichtlich besseren Namen (siehe z. B. die Chars[]-Eigenschaft für System.String).

In C# sind Indexer standardmäßig benannte Elemente. IndexerNameAttribute kann verwendet werden, um diesen Namen anzupassen.

❌ Stellen Sie NICHT sowohl einen Indexer als auch Methoden bereit, die semantisch äquivalent sind.

❌ Geben Sie NICHT mehr als eine Familie überladener Indexer in einem Typ an.

Dies wird vom C#-Compiler erzwungen.

❌ Verwenden Sie KEINE nicht standardmäßigen indizierten Eigenschaften.

Dies wird vom C#-Compiler erzwungen.

Benachrichtigungsereignisse zu Eigenschaftenänderungen

Manchmal ist es hilfreich, ein Ereignis bereitzustellen, das den Benutzer über Änderungen in einem Eigenschaftswert benachrichtigt. System.Windows.Forms.Control löst z. B. ein TextChanged-Ereignis aus, nachdem sich der Wert der Text-Eigenschaft geändert hat.

✔️ ERWÄGEN Sie, Änderungsbenachrichtigungsereignisse auszulösen, wenn Eigenschaftswerte in APIs auf hoher Ebene (normalerweise Designer-Komponenten) geändert werden.

Wenn ein Benutzer wissen sollte, wenn sich eine Eigenschaft eines Objekts ändert, sollte das Objekt ein Änderungsbenachrichtigungsereignis für die Eigenschaft auslösen.

Es ist jedoch unwahrscheinlich, dass sich der Mehraufwand lohnt, solche Ereignisse für APIs auf niedriger Ebene wie Basistypen oder Sammlungen auszulösen. Beispielsweise würde List<T> keine solchen Ereignisse auslösen, wenn der Liste ein neues Element hinzugefügt wird und sich die Count-Eigenschaft ändert.

✔️ Erwägen Sie, Änderungsbenachrichtigungsereignisse auszulösen, wenn sich der Wert einer Eigenschaft über externe Vorgänge ändert.

Wenn sich ein Eigenschaftswert über einen externen Vorgang ändert (also nicht durch Aufrufen von Methoden für das Objekt), geben Sie Ereignisse an,die den Entwickler darüber informieren, dass sich der Wert ändert bzw. geändert hat. Ein gutes Beispiel hierfür ist die Text -Eigenschaft eines Textfeld-Steuerelements. Wenn der Benutzer Text in ein TextBox-Element eingibt, ändert sich der Eigenschaftswert automatisch.

Teile ©2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.

Nachdruck mit Genehmigung von Pearson Education, Inc aus Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Oktober 2008 durch Addison-Wesley Professional als Teil der Microsoft Windows Development Series.

Weitere Informationen