Metodi di estensioneExtension Methods

Metodi di estensione rappresentano una funzionalità del linguaggio che consente di metodi statici per chiamare utilizzando la sintassi di chiamata del metodo di istanza.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Questi metodi devono accettare almeno un parametro, che rappresenta l'istanza che è il metodo su cui operare.These methods must take at least one parameter, which represents the instance the method is to operate on.

La classe che definisce i metodi di tale estensione è definita come la classe "sponsor" e deve essere dichiarata come statica.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Per utilizzare i metodi di estensione, uno necessario importare lo spazio dei nomi che definisce la classe sponsor.To use extension methods, one must import the namespace defining the sponsor class.

X evitare frivolously che definisce i metodi di estensione, in particolar modo nei tipi non si è proprietari.X AVOID frivolously defining extension methods, especially on types you don’t own.

Se si è proprietari di codice sorgente di un tipo, provare a utilizzare i normali metodi di istanza.If you do own source code of a type, consider using regular instance methods instead. Se non si è proprietari e si desidera aggiungere un metodo, prestare molta attenzione.If you don’t own, and you want to add a method, be very careful. Il libero utilizzo di metodi di estensione è potenzialmente ingombrare l'API di tipi che non sono stati progettati per disporre di questi metodi.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ Provare a utilizzando i metodi di estensione in uno dei seguenti scenari:✓ CONSIDER using extension methods in any of the following scenarios:

  • Per fornire supporto funzionalità rilevanti per ogni implementazione di un'interfaccia, se ha funzionalità possono essere scritti in termini di interfaccia principale.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. In questo modo le implementazioni concrete in caso contrario non è possibile assegnare alle interfacce.This is because concrete implementations cannot otherwise be assigned to interfaces. Ad esempio, il LINQ to Objects gli operatori vengono implementati come metodi di estensione per tutti i IEnumerable<T> tipi.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Pertanto, qualsiasi IEnumerable<> implementazione è automaticamente abilitato per LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Quando un metodo di istanza introdurrebbe una dipendenza su un tipo, ma tale dipendenza causa l'interruzione di regole di gestione di dipendenza.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Ad esempio, una dipendenza da String per System.Uri probabilmente non è consigliabile e pertanto String.ToUri() il metodo di istanza restituzione System.Uri sarebbe la progettazione errata da una prospettiva di gestione di dipendenza.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. Un metodo di estensione statici Uri.ToUri(this string str) restituzione System.Uri sarebbe migliore progettazione.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X evitare che definisce i metodi di estensione su System.Object.X AVOID defining extension methods on System.Object.

Gli utenti di Visual Basic non saranno in grado di chiamare tali metodi nei riferimenti agli oggetti utilizzando la sintassi del metodo di estensione.VB users will not be able to call such methods on object references using the extension method syntax. Visual Basic non supporta la chiamata di questi metodi perché, in Visual Basic, dichiarare un riferimento come oggetto forza tutte le chiamate di metodo in modo da essere tardiva associato (membro effettivo chiamato viene determinata in fase di esecuzione), mentre le associazioni ai metodi di estensione vengono determinate in fase di compilazione (associazione anticipata associato).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).

Si noti che la linea guida si applica ad altri linguaggi, in cui è presente lo stesso comportamento di associazione, o in cui non sono supportati i metodi di estensione.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

X non inserire i metodi di estensione nello spazio dei nomi stesso come il tipo esteso a meno che non sia per l'aggiunta di metodi a interfacce o per la gestione delle dipendenze.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 evitare che definisce due o più metodi di estensione con la stessa firma, anche se si trovano in spazi dei nomi diversi.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ Provare a che definisce i metodi di estensione nello spazio dei nomi stesso come il tipo esteso se il tipo è un'interfaccia e i metodi di estensione sono concepiti per essere utilizzate in molti o tutti i casi.✓ 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 non definire metodi di estensione che implementa una funzionalità negli spazi dei nomi in genere associati con altre funzionalità.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Invece, definirli nello spazio dei nomi associato alla funzionalità a che cui appartengono.Instead, define them in the namespace associated with the feature they belong to.

X evitare generico denominazione degli spazi dei nomi dedicato ai metodi di estensione (ad esempio, "estensioni").X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Utilizzare un nome descrittivo (ad esempio, "Routing") invece.Use a descriptive name (e.g., "Routing") instead.

Parti © 2005, 2009 Microsoft Corporation. Tutti i diritti riservati.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

State ristampate dall'autorizzazione di Pearson Education, Inc. da linee guida: convenzioni, idiomi e modelli per le librerie .NET di riutilizzabile, 2nd Edition Krzysztof Cwalina e Brad Abrams, pubblicato il 22 ottobre 2008 di Addison-Wesley Professional come parte della serie di sviluppo di Microsoft Windows.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.

Vedere ancheSee Also

Linee guida di progettazione dei membriMember Design Guidelines
Linee guida per la progettazione di FrameworkFramework Design Guidelines