В чем разница между var foo = new Love ();И объект foo = новая любовь () ;? - PullRequest
2 голосов
/ 01 сентября 2010

Поскольку я не знаком с неявной типизацией; Подскажите, пожалуйста, основные различия между:

 var foo = new Love(); 

И

object foo = new Love();

Ответы [ 4 ]

16 голосов
/ 01 сентября 2010

В первом случае тип foo равен Love. Во втором случае это object.

11 голосов
/ 01 сентября 2010
var foo = new Love(); 

Здесь тип переменной static foo равен Love. Это эквивалентно написанию Love foo = new Love();.

object foo = new Love();

Здесь тип переменной static foo равен object. Вы не можете получить доступ ни к одному из методов Любви, не используя вначале приведение.

Тип динамический (или время выполнения * тип 1019 *) foo равен Love в обоих случаях, поэтому GetType вернет Love для обоих.

6 голосов
/ 01 сентября 2010

При var компилятор выводит тип переменной на основе выражения в правой части оператора присваивания.

Другими словами,

var foo = new Love();

равно точно эквивалентно

Love foo = new Love();

Таким образом, все члены Love будут доступны через foo - тогда как если бы foo был объявлен как тип object, вы имели бы доступ только к GetHashCode(), ToString(), GetType() и Equals().

С var вы все еще используете статическую типизацию (в отличие от dynamic в C # 4). Вы просто не указали явно тип переменной - вы позволяете компилятору решить ее за вас. Однако это должен быть тип, который компилятор может обработать. Например, все они недействительны:

// 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

В этих случаях у компилятора недостаточно информации, чтобы понять, какой тип вы имеете в виду.

2 голосов
/ 01 сентября 2010
var foo = new Love();

здесь это равно

Love foo = new Love();

иногда мы можем использовать var, чтобы избежать длинного имени класса, например Dictionary<string,Dictionary<int,string>>. Вы можете использовать все методы / свойства класса Love.

object foo = new Love();

Теперь foo считается объектом, вы не можете увидеть ни один метод / свойство класса Love, но вы можете преобразовать его обратно.

...