2012-03-20 5 views
-5

Можно создать дубликат:
Use of var keyword in C#Каково точное использование ключевого слова var?

После обсуждения с коллегами по поводу использования «Var» ключевое слово в C# 3 Интересно, что мнения людей были на соответствующих применений умозаключений типа с помощью вар?

Например я довольно лениво используется вар в сомнительных обстоятельствах, например: -

foreach(var item in someList) { // ... } // Type of 'item' not clear. 
var something = someObject.SomeProperty; // Type of 'something' not clear. 
var something = someMethod(); // Type of 'something' not clear. 

Более законного использования вар заключаются в следующем: -

var l = new List<string>(); // Obvious what l will be. 
var s = new SomeClass(); // Obvious what s will be. 

Интересно LINQ, кажется, немного серая область, например: -

var results = from r in dataContext.SomeTable 
       select r; // Not *entirely clear* what results will be here. 

Понятно, какие результаты будут в том, e тип, который реализует IEnumerable, однако это не совсем очевидно так же, как и var, объявляющий новый объект.

Это еще хуже, когда речь заходит о LINQ к объектам, e.g.:-

var results = from item in someList 
       where item != 3 
       select item; 

Это не лучше, чем equivilent foreach(var item in someList) { // ... } equivilent.

Здесь существует серьезная проблема в отношении безопасности типов - например, если бы мы поставили результаты этого запроса в перегруженный метод, который принял IEnumerable<int> и IEnumerable<double>, вызывающий может непреднамеренно передать неправильный тип.

+0

Использование var 'вам не нужно определять тип' кажется очень плохим основанием для его использования ... вы должны знать, что такое тип, var - это просто ярлык, чтобы избежать ввода его – Dotnet

+1

Вы только что скопировали вопрос из дублирующего комментария @ Henrik? –

+1

@Bali C: Да, и если вы посмотрите на его предыдущие вопросы, вы заметите довольно тревожный шаблон ... – BoltClock

ответ

0

Я использую его только как держатель места, пока не уверен, какие типы данных я использую.

Уверенный, что это короткий ответ, но я думаю, что это довольно близко, когда вы должны использовать ключевое слово var.

2

Лично я считаю, что обстоятельства, которые вы описываете, далеки от сомнений, так как нет смысла повторять себя, если вы специально не хотите, чтобы статический тип переменной отличался от статического типа выражения, используемого для инициализации переменной. Например:

IEnumerable<int> foo = new List<int>(); // It's IEnumerable on purpose 

Кроме того, нет абсолютно никаких проблем безопасности типа с var. Точка не, что переменная может быть «любого» типа. Это очень специфический тип, но вы просто не хотите писать этот тип.

+0

Думаю, вы нанесли удар по гвоздю по голове. +1 – Connell

0

ключевое слово var используется как сокращенное обозначение на языке, но не является типом .NET. Компилятор должен знать тип переменной, чтобы использовать ключевое слово var, поэтому является безопасным типом.

Лично я использую его только в том случае, если имя типа также используется в назначении, и имя может быть слишком длинным для дублирования кода.

var dictionary = new Dictionary<string, string>(); 

Он также используется для анонимных типов (но, тем не менее, компилятор должен знать подпись анонимного типа).

var fred = new { Age = 23, Name = "Fred" }; 

Этот метод обычно используется в выбранном пункте из LINQ queries.

0

Просто «абстракция» или «синтаксис», чтобы иметь возможность написать код без указания первых типа (это не вашего первых случаи)

В второго случая: LINQ запросы, вместо , чтобы представить неизвестный, динамичный, а не конкретный, если хотите, тип.

может быть:

var results = from item in someList 
       where item != 3 
       select item; //item a class instance 

может быть

var results = from item in someList 
       where item != 3 
       select item.ItemName; //string property of that class 

может быть

var results = from item in someList 
      where item != 3 
      select new {item.ItemName, item.ID}; //unknown type dynamically generated, that conains the string and integer, like result 
0

Насколько я знаю var остается сильным типизированных. Компилятор рассчитал, какой должен быть соответствующий тип. На самом деле это не имеет никакого реального значения.

Это всего лишь трюк, позволяющий уменьшить количество манипуляций. Например, когда вы меняете тип в одном классе, это может привести к каскаду модификации. Но это единственный способ переноса работы от программиста к компилятору.

Например, ваш запрос Linq приведет к типу IEnumerable<TA>. Когда вы меняете какой-то класс, поэтому результат будет IEnumerable<TB>, нет необходимости изменять эту часть кода.

Смежные вопросы