2010-08-25 4 views
6

Comment comprendre le code suivant? Que signifie "ceci" dans le prototype de la fonction générique? Merci!C# fonction générique question

public static class MyExtensions 
{ 
    public static MyStream<T> MySingle<T>(this T source) 
    { 
     return new MyStream<T>(source); 
    } 
} 

Répondre

7

Qu'il est un extension method, qui devient une méthode valable de tous les objets de type T.

Il n'a rien à voir avec les génériques.

+3

Bon point sur le mot-clé 'this' n'étant pas lié aux génériques. – Oded

16

this dans ce contexte signifie qu'il est une méthode d'extension de sorte que vous pouvez l'utiliser comme "normal":

MyExtensions.MySingle(someSource)

ou ce (parfois plus agréable) façon:

someSource.MySingle()

Ceci n'est possible que lorsque la méthode est static et est dans une classe static. En outre, il n'a rien à voir avec l'aspect générique de la méthode - vous pouvez faire des méthodes d'extension sans aspects génériques et vous avez toujours le this en face du paramètre. Les méthodes d'extension, comme son nom l'indique, sont utilisées pour étendre des classes déjà existantes avec des méthodes si vous n'avez pas accès à la source ou si vous voulez qu'elle soit utilisée sur un large ensemble de classes. Il est important de noter que vous n'avez pas accès aux méthodes privées et protégées, etc., comme lorsque vous dérivez de la classe, lorsque vous créez une méthode d'extension sur un type.

En outre, pour une explication détaillée:

Extension Methods (C# Programming Guide)

1

Ceci est une méthode d'extension, this est l'instance que le procédé est appliqué.

0

Ceci indique qu'il s'agit d'une méthode d'extension. Le type en cours d'extension est 'T'. Toutes les instances de 'T' auront la méthode MySingle.

2

MySingle<T> est défini comme extension method (MSDN).

Cela signifie que l'utilisation, vous pouvez l'appeler comme ceci:

MyStream<string> stringStream = "a string".MySingle(); 

Ceci est identique à l'appeler de la manière « standard »:

MyExtensions.MySingle("a string"); 

Lorsque vous appelez la première manière (comme une méthode d'extension), l'élément sur lequel il est appelé est passé en tant que premier paramètre. Le type du premier paramètre définit donc le type sur lequel la méthode d'extension peut être appelée, mais comme vous avez un type générique ouvert, il peut être appelé sur n'importe quel objet.

Pour définir une méthode d'extension, la classe conteneur et la méthode elle-même doivent être déclarées static.

Des méthodes d'extension ont été ajoutées dans C# 3.0 et VB 9.0.

1

Oui, c'est une méthode d'extension mais pour autant que je sache, il demande aussi ce que cela signifie d'utiliser une T (définition de type générique) avec le mot clé "this" dans la signature de la méthode.

Cela signifie que la méthode d'extension sera une méthode valide pour tous les objets de tous les types de classe et de structure de votre projet.