ErweiterungsmethodenExtension Methods

Erweiterungsmethoden sind eine Sprachfunktion, die statische Methoden, mit der Aufruf der Instanzmethodensyntax aufgerufen werden kann.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Diese Methoden müssen mindestens einen Parameter ausführen, das die Instanz, die die Methode, die darstellt zu verarbeitende ist.These methods must take at least one parameter, which represents the instance the method is to operate on.

Klasse, die diese Erweiterungsmethoden definiert wird wie die Klasse "Sponsor" bezeichnet, und es muss als statisch deklariert werden.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Um Erweiterungsmethoden verwenden zu können, muss eine den Namespace Definieren der Sponsor-Klasse zu importieren.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID frivolously Definieren von Erweiterungsmethoden [C#], insbesondere auf Typen, die Sie nicht besitzen.X AVOID frivolously defining extension methods, especially on types you don’t own.

Wenn Sie Quellcode eines Typs besitzen, sollten Sie Sie, verwenden Sie stattdessen die regulären Instanzmethoden zur Verfügung.If you do own source code of a type, consider using regular instance methods instead. Seien Sie vorsichtig, wenn Sie nicht besitzen, und eine Methode hinzugefügt werden soll.If you don’t own, and you want to add a method, be very careful. Der großzügigen Verwendung von Erweiterungsmethoden hat das Potenzial von datenbeschriftungen-APIs von Typen, die nicht dafür konzipiert wurden, diese Methoden.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER Erweiterungsmethoden in einem der folgenden Szenarien verwenden:✓ CONSIDER using extension methods in any of the following scenarios:

  • Um Hilfe zu bieten kann Funktionen, die für jede Implementierung einer Schnittstelle, relevant, wenn Funktionen als in Bezug auf die Kernschnittstelle geschrieben werden.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Dies ist da konkrete Implementierungen andernfalls Schnittstellen zugewiesen werden können.This is because concrete implementations cannot otherwise be assigned to interfaces. Z. B. die LINQ to Objects Operatoren werden als Erweiterungsmethoden implementiert, für alle IEnumerable<T> Typen.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Daher alle IEnumerable<> Implementierung wird automatisch mit LINQ-fähigen.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Wenn eine Instanzmethode einer Abhängigkeit auf eine Art, aber diese Abhängigkeit führen würde, werden Management Abhängigkeitsregeln unterbrochen.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Z. B. eine Abhängigkeit vom String zu System.Uri ist wahrscheinlich nicht wünschenswert, daher String.ToUri() Instanzmethode zurückgeben System.Uri wäre der falsche Entwurf vom Standpunkt der Abhängigkeit Management.For example, a dependency from String to System.Uri is probably not desirable, and so String.ToUri() instance method returning System.Uri would be the wrong design from a dependency management perspective. Eine statische Erweiterungsmethode Uri.ToUri(this string str) zurückgeben System.Uri wäre ein viel besseres Konzept.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID definieren Erweiterungsmethoden für System.Object.X AVOID defining extension methods on System.Object.

VB-Benutzer werden keine Methoden auf Objektverweise, die mit der Syntax von Erweiterungsmethoden aufrufen können.VB users will not be able to call such methods on object references using the extension method syntax. VB unterstützt keine Methoden aufrufen, da in VB, deklarieren Sie einen Verweis als Objekt erzwingt, dass alle zugehörigen Methodenaufrufe zu spät gebunden (tatsächlichen Member mit dem Namen wird zur Laufzeit bestimmt), während die Bindungen für Erweiterungsmethoden zur Kompilierzeit (frühes bestimmt werden gebunden).VB does not support calling such methods because, in VB, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at runtime), while bindings to extension methods are determined at compile-time (early bound).

Beachten Sie, dass die Richtlinie für andere Sprachen gilt, wenn das gleiche Bindungsverhalten vorhanden ist, oder, in denen Erweiterungsmethoden werden nicht unterstützt.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

X DO NOT denselben Namespace aufweist wie die erweiterten Typ, sofern dies nicht für das Hinzufügen von Methoden auf Schnittstellen oder abhängigkeitsverwaltung Erweiterungsmethoden gelagerte.X DO NOT put extension methods in the same namespace as the extended type unless it is for adding methods to interfaces or for dependency management.

X AVOID mindestens zwei Erweiterungsmethoden mit gleicher Signatur definieren, auch wenn sich beide in unterschiedlichen Namespaces befinden.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER Erweiterungsmethoden in demselben Namespace wie den erweiterten Typ definieren, wenn der Typ eine Schnittstelle ist und die Erweiterungsmethoden in den meisten oder allen Fällen verwendet werden sollen.✓ CONSIDER defining extension methods in the same namespace as the extended type if the type is an interface and if the extension methods are meant to be used in most or all cases.

X DO NOT Erweiterungsmethoden implementieren eine Funktion in Namespaces, die üblicherweise mit anderen Funktionen definieren.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Stattdessen definieren sie in der die Funktion ebenfalls zugeordnete Namespace.Instead, define them in the namespace associated with the feature they belong to.

X AVOID generische Benennung von Namespaces für die Erweiterungsmethoden (z. B. "Extensions") vorgesehen.X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Verwenden Sie einen beschreibenden Namen (z. B. "Routing") stattdessen.Use a descriptive name (e.g., "Routing") instead.

Teile ©2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Pearson Education, Inc. über Rechte vorbehalten Framework-Entwurfsrichtlinien vorgestellt: Aufrufkonventionen, Ausdrücke und Muster für die Wiederverwendbare Bibliotheken für .NET, 2. Auflage Krzysztof Cwalina und Brad Abrams, 22. Oktober 2008 von Addison-Wesley Professional als Teil der Microsoft Windows Development-Reihe veröffentlicht.Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

Siehe auchSee also