9
votes

Comment le système sait-il quoi utiliser lorsque ce mot-clé est utilisé?

Comment le système sait-il quoi utiliser lorsque "Ceci" mot-clé est utilisé?

Récemment, on m'a posé cette question dans une interview. N'ayant jamais pensé à cela, j'ai répondu que le système connaîtra le contexte actuel dans lequel le flux de contrôle est et décidera de l'objet d'être utilisé au lieu de cela. L'intervieweur n'a pas regardé heureux et il passa à la question suivante.

Quelqu'un peut-il me dire ce que l'intervieweur a peut-être voulu demander et quelle serait la réponse? (Je pense que cela peut interprété de différentes manières et donc à garder cela comme wiki à moins que quelqu'un ne signale pas ..)


2 commentaires

"Le système" voulez-vous dire le compilateur Java? Le compilateur C #?


@Joseph Pouvons-nous le revenir au non-wiki?


11 Réponses :


9
votes

Ce est un paramètre masqué dans toutes les méthodes d'un objet et contient une copie du pointeur d'instance.


0 commentaires

1
votes

au moment de l'exécution "Ceci" va résoudre le pointeur sur l'objet actuel, "le système" sera donc en mesure d'appeler une méthode respective sur cet objet.


2 commentaires

"..." Ceci "va résoudre le pointeur à l'objet actuel". Comment ça sait sur l'objet actuel?


Je suppose que la pile de méthodes recevra un paramètre supplémentaire avec une adresse de l'objet dans quel contexte une méthode est exécutée.



0
votes

in C, ce pointeur est un argument de pointeur invisible à votre classe.

Donc, en substance, le premier argument à une méthode de classe est le pointeur de la classe elle-même. Vous y référez-le en utilisant ceci.


1 commentaires

'Ceci n'est pas un mot clé dans C.



1
votes

J'aurais répondu "C'est une référence à l'instance de la classe actuelle."

DAN


1 commentaires

Ce n'est pas une réponse à la question du tout.



12
votes

Le mot clé code> est un pointeur sur l'objet actuel. Tous les fonctions de membre non statiques forts> d'une classe ont accès à un ce pointeur.

Le pointeur sur l'objet actuel est normalement disponible par le compilateur dans une fonction de membre non statique en utilisant un registre , généralement ecx. Donc, lorsque vous écrivez ceci code> dans une fonction de membre non statique, le compilateur traduira cet appel dans le chargement de l'adresse d'ECX. P>

Vérifiez cet exemple simple: P>

004114DE  lea         ecx,[t]


1 commentaires

Comme c'est c #, plus il serait approprié de CIL.



2
votes

considérer cette classe xxx

et ce code qui appelle SetData (): xxx

lorsque le code ci-dessus est compilé, le compilateur Emet quelque chose équivalent à cela pour la fonction membre: xxx

et le code d'appel est converti en quelque chose comme ceci: xxx

Qu'est-ce que cela signifie que lors de la compilation:

  1. Les fonctions membres sont converties en fonctions simples et globales.

  2. L'instance de classe auxquelles les fonctions des membres "appartiennent" est simplement transmise en tant que premier argument (ou plutôt que son adresse est passée).

    Donc, en conclusion, ce que vous appelez que ce pointeur de votre code se termine simplement comme le premier argument à la fonction. C'est ainsi que le "système sait" quel objet pour accéder via le "ceci" pointeur.

    L'exemple ci-dessus est de C ++. Si vous oubliez un instant sur le CLR et la jitting et tout cela, que se passe-t-il dans C # est conceptuellement la même chose.


0 commentaires

0
votes

compilateur shematicaly convertit ce code: xxx

dans ce code si "SOMEMETHOD" n'est pas virtuel: xxx

ou dans ce code Si "Somemethod" est virtuel: xxx

et partout où vous placez "ce" mot clé premier paramètre est utilisé à la place;

du compilateur de cours peut optimiser / simplifier en supprimant le premier argument et utiliser un registre de la CPU (normalement ESX) pour stocker l'adresse de l'objet.


0 commentaires

1
votes

Le compilateur s'occupe de résoudre correctement cette référence lors de la compilation. Si vous voulez en savoir plus sur certaines des techniques qu'ils utilisent pour le faire, ce livre vous dira tout ce que vous devez savoir:
http://fr.wikipedia.org/wiki/compilers:_principles,_techniques, _ et_tools
Le livre de dragon


0 commentaires

0
votes

Ma réponse aurait été "qui se soucie? Ça sait. Si j'ai besoin de savoir plus en détail, je vais google ça."

Vous savez évidemment ce que l'effet de l'utilisation de "ceci" serait, ce qui est sûrement la chose importante. Pour 99% des tâches de programmation, j'aurais pensé que le détail de la façon dont il est résolu en interne est une trivia.


2 commentaires

Cette attitude ne serait probablement pas susceptible de gagner l'approbation de l'intervieweur.


Eh bien, ma réponse si je ne savais pas la réponse réelle serait ce qui sera ci-dessus!



0
votes

L'opérateur "Cet" pointe sur l'objet actuel. Un exemple où la présence d'un opérateur "Cet" différence sera la différence est la suivante: xxx

Notez que "cet" opérateur ne changera pas quelle fonction virtuelle sera appelée si elle est remplacée dans une classe enfant xxx

si vous exécutez le code suivant xxx

appellera toujours le myClass2.test () et non Myclass.test ()

Donc, donc l'opérateur "Cet" vous dit simplement que vous accédez à quelque chose déclaré au niveau de la classe.


1 commentaires

Qu'entendez-vous par «que l'opérateur« Cet »ne changera pas quelle fonction virtuelle sera appelée si elle est remplacée dans une classe enfant» ... Qu'entendez-vous par ceci (Pun n'est pas prévu)?



13
votes

Bien que les réponses qui soulignent que la référence "Cette" référence est essentiellement transmise en tant que magie "paramètre caché" à l'appel est essentiellement correct, l'histoire complète est en fait un peu plus compliquée en C # que d'on pourrait penser au début. coup d'œil.

Les types de référence sont simples; L'objet référencé est vérifié pour NULL puis transmis conceptuellement sous forme de paramètre Sans nom, non variables appelé "Ceci". L'histoire est compliquée par des types de valeur.

N'oubliez pas que les types de valeur sont, par définition, passés par la valeur - c'est-à-dire en effectuant une copie des données. D'où leur nom. Mais des types de valeur mutable clairement mutable - qui sont pure mal et doivent être évités - ne peuvent pas être transmis par la valeur que "Ceci", car si vous appelez un mutateur, le "Ceci" dans la méthode de mutateur serait muté de la copie, non l'original!

Par conséquent, dans l'appel de la méthode de type valeur, "Ceci" n'est pas la valeur du récepteur, il est un alias à la variable représentant l'emplacement de stockage du récepteur . Nous implémentons cela en passant "Ceci" comme l'adresse gérée du récepteur, pas la valeur du récepteur.

Maintenant, nous pouvons soulever une autre difficulté. Et si la variable stocker la valeur étant mutée est une variable lecture seule ? Maintenant que faisons-nous? Si vous êtes curieux, lisez mon article sur le sujet et voyez si vous pouvez répondre correctement au puzzle présenté:

http: //blogs.msdn .Com / Ericlippert / Archive / 2008/05/14 / Mutating-Readonly-Structs.aspx


2 commentaires

Merci de vous pour vos paroles de sagesse O Tirez-la .... Maintenant, veuillez vous déplacer et mettre en œuvre de nouvelles fonctionnalités de Langue qui soufflera nos esprits collectifs


Merci pour la réponse et un grand lien.