2010-09-01 22 views

Répondre

16

Dans le premier cas, le type de foo est Love. Dans le second cas, il s'agit de object.

+0

+1 Il n'y a vraiment rien de plus à dire: D – Jonathan

+1

Gardez à l'esprit que GetType est identique dans les deux cas. – Giorgi

+0

N'oubliez pas non plus la mise en boîte des types de valeur lorsque vous utilisez un objet :) – Arcturus

11
var foo = new Love(); 

Ici, la variable type de statiquefoo est Love. C'est équivalent à écrire Love foo = new Love();.

object foo = new Love(); 

Ici, la variable type de statiquefoo est object. Vous ne pouvez accéder à aucune des méthodes de Love sans utiliser d'abord un cast.

Le dynamique de type (ou exécution type) de foo est Love dans les deux cas, ce qui est la raison pour laquelle GetType retournera Love pour les deux.

6

Avec var, la compilation infère le type de la variable en fonction de l'expression sur le côté droit de l'opérateur d'affectation.

En d'autres termes,

var foo = new Love(); 

est exactement équivalent à

Love foo = new Love(); 

Ainsi, tous les membres de Love seront disponibles via foo - alors que si foo ont été déclarés être de type object , vous n'auriez accès qu'à GetHashCode(), ToString(), GetType() et Equals().

Avec var, vous utilisez toujours le typage statique (par opposition à l'utilisation de dynamic dans C# 4). Vous n'indiquez pas explicitement le type de la variable - vous laissez le compilateur travailler pour vous. Cependant, il doit être un type que le compilateur peut. Ainsi, par exemple, ce sont tous les invalides:

// All invalid 
var a = null; 
var b = delegate() { Console.WriteLine("Hello"); }; 
var c = x => Console.WriteLine("lambda: " + x); 
var d = MethodName; // Attempted method group conversion 

Dans ces cas, le compilateur ne dispose pas de suffisamment d'informations pour établir quel type vous voulez dire.

+0

Ne pas oublier la boxe des types de valeur lors de l'utilisation de l'objet :) – Arcturus

2
var foo = new Love(); 

ici, il est égal à

Love foo = new Love(); 

nous pouvons parfois utiliser var pour éviter les longs nom de classe par exemple Dictionary<string,Dictionary<int,string>>. Vous pouvez utiliser toutes les méthodes/propriétés de la classe Love.

object foo = new Love(); 

Maintenant foo est considéré comme un objet, vous ne pouvez pas voir toute méthode/propriété de classe Amour, mais vous pouvez le convertir en arrière.