2009-02-18 7 views
6

Je remarqué cette utilisation intéressante du « ce » mot-clé tout en regardant le code désassemblé de Int32.GetHashCode() dans .NET réflecteur:Le mot clé "this" peut-il être utilisé avec des types de valeur?

public override int GetHashCode() 
{ 
    return this; 
} 

J'ai toujours pensé « ce » est utilisé uniquement avec les types de référence non valeur les types. Dans le code ci-dessus, la boxe sera-t-elle utilisée à chaque fois que vous essayez d'obtenir le code de hachage d'un int?

De la documentation de "ce" mot-clé dans MSDN: - Le mot-clé this fait référence à l'instance actuelle de la classe

Cordialement

Répondre

12

Oui, this est valide pour les types de valeur. Cela ne mène pas à la boxe. Bien qu'il fasse référence au type de valeur, il ne s'agit pas d'une référence dans la même veine que les références de type référence: il s'agit d'une commodité de compilation/temps de développement plutôt que d'une référence d'exécution.

Section 7.5.7 du C# cahier des charges précise:

  • Lorsque cela est utilisé dans un primaire expression au sein d'un constructeur exemple d'un struct, il est classé comme variable. Le type de la variable est le type d'instance (§10.3.1) de la structure dans laquelle l'utilisation se produit, et la variable représente la structure construite. La cette variable d'un constructeur d'instance d'une struct se comporte exactement comme un hors paramètre du type particulier dans struct , cela signifie que la variable doit être définitivement attribué dans chaque chemin d'exécution du constructeur d'instance .

  • Lorsque cela est utilisé dans un -expression primaire dans une méthode d'instance ou accesseur exemple d'une structure, elle est classée en tant que variable . Le type de la variable est le type d'instance (§10.3.1) de la structure dans lequel l'utilisation se produit.
    • Si la méthode ou accesseur n'est pas un iterator (§10.14), cette variable la représente la structure pour laquelle la méthode ou accesseur a été invoqué, et se comporte exactement comme un ref paramètre du type struct.
    • Si la méthode ou accesseur est un itérateur, la cette variable représente une copie de la struct pour lequel la méthode ou accesseur a été invoqué, et se comporte exactement la même chose en tant que paramètre de valeur de la struct type.
+0

Merci beaucoup, je suis tombé sur la même section après avoir ajouté ma question.J'aurais dû vérifier la spécification avant de poser la question. –

+0

Pas de problème - tout semble facile une fois que vous le savez. :) –

Questions connexes