9
votes

Pourquoi "statique" et "ceci" sont-ils nécessaires pour les méthodes de vulgarisation et comment leur mémoire est-elle allouée?

Quelques questions sur les méthodes d'extension:

  1. Pourquoi les méthodes d'extension sont-elles statiques?

  2. Pourquoi doivent-ils être déclarés dans une classe statique?

  3. Que signifie le ce mot clé dans la liste des paramètres de la méthode d'extension? Comme il s'agit d'une classe statique, comment le mot clé fonctionne-t-il dans ce contexte?

  4. Comment l'allocation de la mémoire se produit-elle pour ces types de méthodes?


5 commentaires

msdn.microsoft.com/en-us/library/bb383977.aspx


Je suis particulièrement intéressé par l'aspect de l'allocation de la mémoire des méthodes de vulgarisation, puisque LINQ les utilise partout.


Le spectacle est exécuté par compilerservices.extensionAttribute


Pourquoi ont-ils besoin d'être Déclaré dans une classe statique? Qu'est-ce que ce mot clé indique? < / a>


@Alexandre, @Nasmifive Quel type d'aspect de l'allocation de mémoire attendez-vous une méthode d'extension? C'est juste une méthode régulière ...


5 Réponses :


8
votes

La seule différence entre une méthode statique et non statique est qu'une méthode non statique reçoit un paramètre implicite - ceci . Les méthodes d'extension ne sont pas appelées dans le contexte de l'objet sur lequel la méthode est déclarée, il n'existe donc aucun moyen de les transmettre le cette référence , ils doivent donc être statiques.

Vous ne pouvez pas utiliser le mot-clé ceci à l'intérieur d'une méthode d'extension, j'espère que cela répond à votre troisième question. Le mot clé de ce dans la liste des paramètres est là simplement pour indiquer quel type cette méthode s'étend.

Quelle est votre question sur l'allocation de la mémoire? Une méthode d'extension est tout comme n'importe quelle autre méthode statique, seule la syntaxe d'appel est différente.


2 commentaires

Hmm, ne pas que les méthodes non statiques ordinaires reçoivent également un paramètre implicite ? Ou est-ce un détail de mise en œuvre spécifique à C ++?


@Cody Oui, ils font. Pour une raison quelconque, @Robert Harvey a édité ma réponse à quelque chose de mal et de différent de ce que je voulais dire. Je l'ai retourné maintenant.



0
votes

C'est juste comment ils sont définis - avec ce mot clé précédant le premier paramètre, qui correspond à l'instance de l'objet que vous appelez la méthode sur. Pourquoi Tostring () appelé Tostring ()? Pourquoi statique est-elle utilisée pour statique? Pourquoi l'herbe est-elle verte? Je suppose que les puissances qui ont été décidées de mettre une ceci devant le premier paramètre, au lieu de venir avec une nouvelle "extension" de mot-clé à mettre en avant le nom de la méthode.

généré par le compilateur traduit votre code dans un appel sur la méthode statique, même si la syntaxe peut ressembler à un appel sur une méthode d'instance. Mais ce n'est pas - c'est une statique, qui n'a aucun accès aux membres privés de votre objet.


0 commentaires

1
votes
  1. car il n'y a pas d'instance pour les appeler.

  2. Je pense que c'est de limiter le nombre d'erreurs possibles s'il a été déclaré en classe non statique.

  3. Il dit sa méthode d'extension. Compilateur le voit et permet de l'utiliser sur le type déclaré comme ceci, à la place comme méthode statique.

  4. Méthode d'extension L'appel n'est que du sucre syntaxique. Cet appel est converti en une méthode statique ordinaire appel dans IL.


0 commentaires

1
votes

La réponse à 1,2, et 4 est à peu près la même chose. Méthodes d'extension sont tout simplement des méthodes statiques avec un peu de sucre spécial syntactique. Ceci:

public static void DoIt(string str) {
    // ..
}

DoIt("test");


0 commentaires

4
votes

Pourquoi les méthodes d'extension statique?

Parce que vous ne pouvez pas modifier la classe d'ajouter des méthodes d'instance. Il est tout le sucre syntaxique pour faire des appels à ces méthodes plus agréable, rien de plus.

Pourquoi doivent-ils être déclarés dans une classe statique?

Parce que nous ne sommes pas censés créer des instances de la classe. Il est une décision de conception. Pourquoi compliquer les choses comme avoir des instances d'une classe qui a des méthodes d'extension attachées à ceux qui pourraient ne pas être encore utilisable?

Qu'est-ce que le mot clé this indique dans la liste des paramètres de la méthode d'extension? Comme il est une classe statique comment le « ce » travail mot-clé dans ce contexte?

Il est une méthode statique. ce n'a pas de sens dans ce contexte. Le this dans la signature est juste un moyen pour indiquer qu'une méthode d'extension est déclarée.

Comment l'allocation de mémoire se produit pour ce type de méthodes?

Confus au sujet de celui-ci. Ils sont toutes les méthodes statiques sur une classe statique. Ils sont la méthode « attribués » comme tout autre (static), il n'y a qu'une seule copie du code pour le type.


0 commentaires