2013-05-01 7 views
2

En C#Que retourne une propriété String String?

Supposons que je donne les résultats suivants:

public String whatHappens{ get; set; } 

Supposons que la propriété a été initialisé et défini.

Alors ici j'appelle

Console.WriteLine(whatHappens); 

Est-ce que l'EEG Mémorisateur un objet chaîne et la ToString d'appel Console.WriteLine() OU Est-ce que l'appel GET à appeler tour la méthode ToString() dans le chaîne de caractères et renvoie une chaîne.

Ce n'est pas une question d'école, c'est un argument que mon collègue et moi-même avons.

+5

Une référence à un objet chaîne est renvoyée par l'accesseur de propriété, et la surcharge de Console.WriteLine() qui prend une chaîne est appelée, et 'ToString()' n'est PAS appelé du tout. (Notez que le compilateur génère un champ de chaîne caché pour que la classe implémente une propriété de chaîne automatique telle que celle que vous avez spécifiée, et il s'agit d'une référence à ce champ de chaîne cachée renvoyé par le getter.) –

+2

Vous n'avez pas à '.ToString()' a 'string'; c'est déjà une 'chaîne '. – JosephHirn

Répondre

7

Dans votre exemple, vous utilisez une propriété automatique. Une propriété automatique a un champ caché supplémentaire, le champ de support. Ce champ est du même type que la propriété, dans votre cas une chaîne.

A l'intérieur de cette propriété, le code n'appelle pas ToString() puisque le champ de support est déjà de type string.

Console.WriteLine a de nombreuses surcharges. L'une de ces surcharges accepte un paramètre de type string. Donc à l'intérieur Console.WriteLine il n'est pas nécessaire d'appeler ToString(), car le paramètre est déjà de ce type.

En résumé: Aucun ToString() ne sera appelé n'importe où.

Si, d'autre part, la propriété n'était pas une propriété automatique et que le ou les champs derrière elle sont d'un autre type, alors ils devraient être convertis en une chaîne, en utilisant ToString().

Si, d'autre part, une autre surcharge de Console.WriteLine a été appelé, où le paramètre était de type object, que WriteLine doit appeler ToString() à un moment donné.

+0

Le libellé de votre avant-dernier "paragraphe" donne l'impression que "ToString()" n'est jamais nécessaire avec une propriété automatique. 'ToString()' serait appelé dans tous les cas où le type n'était pas déjà 'String'. – Cemafor

+0

@Cemafor: Toute propriété automatique n'appelle aucune méthode de conversion, car le champ de sauvegarde est toujours du même type que la propriété. Pourquoi convertir les données si elles sont du même type. Cela ne ferait que consommer des performances. –

+0

Je veux dire dans le cas où 'Console.WriteLine (whatHappens);' est appelé, ce que je suppose est où la question d'appeler 'ToString()' se pose. – Cemafor

Questions connexes