2010-08-20 31 views
3

Je suis un peu confus quant à savoir pourquoi cela ne donne pas une erreur. J'ai trouvé ce code à l'intérieur de certains anciens logiciels obsolètes et j'ai été surpris de le voir fonctionner.Méthodes d'extension en C#: pourquoi cela fonctionne-t-il?

public static string CleanFileName(this string fileName) 
{ 
    return CleanFileName(fileName, 64); 
} 

public static string CleanFileName(this string fileName, int maxLength) 
{ 
    //some logic 
} 

Mon expérience avec les méthodes d'extension est de l'appeler comme ceci:

fileName.CleanFileName(64); 

Est-ce que le travail parce que sa méthode statique ainsi? Est-ce une pratique courante et juste quelque chose que je n'ai pas encore vu ou un morceau de code hérité dépassé que je devrais tuer avec le feu?

+0

Pourquoi pensez-vous que cela ne devrait pas fonctionner? http://msdn.microsoft.com/en-us/library/bb383977.aspx indique clairement que 'les méthodes d'extension sont un type spécial de méthode statique, mais elles sont appelées comme si elles étaient des méthodes d'instance sur le type étendu'. –

Répondre

10

Les méthodes d'extension peuvent toujours être appelées comme si le modificateur "this" n'était pas encore là (aka comme une méthode statique normale). C'est moins lisible pour ce faire, mais syntaxiquement valide.

L'autre réponse est trompeuse parce que "Cela fonctionne parce que l'appel de méthode est fait à partir du même type que sa surcharge." implique quelque chose sur les méthodes d'extension. Vous pouvez appeler les méthodes d'extension en tant que méthodes statiques normales, quelle que soit la classe dans laquelle vous vous trouvez. Mais à travers les commentaires ci-dessous, il semble que la confusion soit de savoir si la classe doit être qualifiée ou non. Et dans cette veine, Nathan a raison de dire que la raison pour laquelle le nom de la classe peut être éludé est parce que l'appel arrive de l'intérieur de la même classe que la surcharge.

+1

Je pense que l'affirmation que l'autre réponse est "manifestement fausse" est incorrecte. Dans un type, vous pouvez appeler des méthodes statiques de ce type sans préfixer l'appel de méthode avec le type de déclaration. Ainsi, voir l'appel d'une méthode d'extension d'une autre sans préfixe de type déclarant, dans le même type fonctionne exactement comme toutes les autres déclarations statiques qui ne sont pas des "extensions". –

+0

Oui, mais le ** point ** est que cela n'a rien à voir avec si vous êtes "dans le même type" ou non. Vous pouvez utiliser cette syntaxe de type ** any **. –

+0

Je crois que Nathan essayait d'expliquer pourquoi il est légal d'écrire return CleanFileName (fileName, 64); au lieu d'écrire return ClassName.CleanFileName (fileName, 64); C'est en effet légal car l'appel est dans le type déclaré. Je crois également que c'est le cœur de ce que le PO demandait. –

6

Cela fonctionne parce que l'appel à CleanFileName(string, int) est fait à partir du même type que CleanFileName(string), ce qui permet à l'appel d'être fait dans la syntaxe de la méthode standard, plutôt que la syntaxe de la méthode d'extension. En tant que tel, aucun préfixe d'instance de chaîne n'est requis devant la méthode d'extension.

Sémantiquement parlant, static string Foo(this string foo, int bar) { } peut être appelé sous la forme Foo(string, int) ou string.Foo(int).

+1

Aucune idée qui a voté bas ceci, c'est la bonne réponse. – DavidWhitney

+1

Je me demande la même chose ... –

+1

Je ne l'ai pas déprécié, mais la réponse n'a rien à voir avec le fait que vous l'appeliez de "l'intérieur du même type". –