Там какая-либо техническая причина состоит в том, чтобы использовать или не использовать var в C#, когда тип известен?

Кажется, что все больше кода C#, который я прочитал, использует идентификатор типа var:

foreach (var itemChange in ItemChanges)
{
   //... 
}

вместо того, чтобы явно указать тип:

foreach (ItemChange itemChange in ItemChanges)
{
   //... 
}

даже когда тип известен.

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

Но есть ли какая-либо техническая причина для использования один или другой?

11
задан Edward Tanguay 15 December 2009 в 09:07
поделиться

8 ответов

var is a C# 3.0 feature only mandatory in anonymous type

Because following code

var v = new { Amount = 108, Message = "Hello" };

dynamically create a new anonymous type, var usage is mandatory. For example, var is particularly useful in Linq where type are often created dynamically.

In any other situations, it's only a matter of taste for final application (it's resolved during compilation). But for code readers, I think 'var' is less informative that type itself.

3
ответ дан 3 December 2019 в 01:04
поделиться

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

Однако использование var позволяет изменять программу без необходимости ее редактирования . Если задано

public int SomeMethod(){}
public List<T> SomeOtherMethod<T>(T parameter);

, то

var x = SomeMethod();
var y = SomeOtherMethod(x);

Будет работать (а y будет List ). Если бы вы использовали

int x = SomeMethod();
List<int> y = SomeOtherMethod(x);

, то если бы SomeMethod () было изменено на возвращение long , тогда вам пришлось бы изменить определение y.

Я видел это такие вещи распространяются по программе, требуя сотен изменений. Частным случаем было изменение кода доступа к данным, чтобы он возвращал ReadOnlyCollection , а не List . Требовалось столько изменений кода, что я изменил все явные упоминания List на var,

1
ответ дан 3 December 2019 в 01:04
поделиться

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

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

var obj = SomeMethod(); // what's the type? you'd have to inspect SomeMethod()
SomeClass obj = SomeMethod(); // the type is obvious

, но в других случаях используется var имеет смысл, например,

var obj = new SomeClass(); // the type is obvious
SomeClass obj = new SomeClass(); // the duplication of type is unnecessary
21
ответ дан 3 December 2019 в 01:04
поделиться

Единственная известная мне техническая причина заключается в том, что вы можете выполнять неявное приведение без var , например,

int i = 5;
double a = i; // implicit cast with explicit types

, но здесь я предпочитаю var как делает приведение явным; в то время как меня не так сильно волнуют типы, которые меня волнуют, когда я выполняю преобразование типа с изменением представления:

var a = (double)i; // explicit cast with implicit types

Но на самом деле основная причина - удобочитаемость, как вы сказали. Вам нужно задать себе вопрос: почему вы думаете, что конкретный конкретный тип важен для читабельности? Всегда ли вы пишете запросы Linq, вызывающие конкретный тип, например

from ItemChange itemChange in ItemChanges

// instead of

from itemChange in ItemChanges

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

ItemChanges.Select<ItemChange, ItemChange>((ItemChange itemChange) => ...);

// instead of

ItemChanges.Select(itemChange => ...);

Или вы счастливы позволить компилятору выполнить некоторую работу для вас и пусть он сам определяет типы за "счет" о том, что информация о типе не указана явно?

Если вас устраивает вывод типов в linq и общих методах, значит, вы уже приняли решение, что вас устраивает отсутствие явного указания типов везде, и, вероятно, вы не обнаружили, что ваш код любой менее читаемый в результате (на самом деле, вы, вероятно, обнаружили совершенно противоположное). Так что использование var - это еще один шаг по тому же пути, по которому вы уже идете.

3
ответ дан 3 December 2019 в 01:04
поделиться

Нет, просто удобочитаемость.

12
ответ дан 3 December 2019 в 01:04
поделиться

В общем, никаких технических причин. Читаемость в любом направлении - единственный реальный фактор.

Однако есть одно небольшое предостережение: var будет выводить статический тип переменной. Если вам нужен тип подкласса или суперкласса, вам нужно будет выполнить кастинг самостоятельно. В случае foreach , как в вашем примере, вы обычно можете выполнить понижающее преобразование «бесплатно», просто объявив переменную цикла с типом подкласса.

Классический пример - итерация по XML NodeList, который вы знаете, - это список XmlElement , но Nodelist типизирован как коллекция XmlNode s. Конечно, вы можете использовать приведение или как , чтобы вернуть нужный тип, но это, казалось бы, противоречит цели использования вывода типа: -)

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


Еще одна вещь, которая немного раздражает, - это то, что если вы используете такой инструмент, как Resharper, он очень агрессивно предлагает вам использовать var во всех возможных ситуация. Особенно раздражает, когда он рекомендует вам изменить, например, объявление int на var !

Однако, если вы не отключите эту функцию, вы получите меньше шума "от Resharper, чем больше вы используете var .

компилятор сообщит вам об этом, как только вы попытаетесь использовать член узла, который доступен только для XmlElement - так что это все еще не строго техническая разница.


Еще одна вещь, которая является Немного раздражает то, что если вы используете такой инструмент, как Resharper, он очень агрессивно предлагает вам использовать var во всех возможных ситуациях. Особенно раздражает, когда он рекомендует вам изменить, например, объявление int на var !

Однако, если вы не отключите эту функцию, вы получите меньше шума "от Resharper, чем больше вы используете var .

компилятор сообщит вам об этом, как только вы попытаетесь использовать член узла, который доступен только для XmlElement - так что это все еще не строго техническая разница.


Еще одна вещь, которая является Немного раздражает то, что если вы используете такой инструмент, как Resharper, он очень агрессивно предлагает вам использовать var во всех возможных ситуациях. Особенно раздражает, когда он рекомендует вам изменить, например, объявление int на var !

Однако, если вы не отключите эту функцию, вы получите меньше шума "от Resharper, чем больше вы используете var .


Еще одна вещь, которая немного раздражает, - это то, что если вы используете такой инструмент, как Resharper, он очень агрессивно предлагает вам использовать var во всех возможных ситуациях. Особенно раздражает, когда он рекомендует вам изменить, например, объявление int на var !

Однако, если вы не отключите эту функцию, вы получите меньше шума "от Resharper, чем больше вы используете var .


Еще одна вещь, которая немного раздражает, - это то, что если вы используете такой инструмент, как Resharper, он очень агрессивно предлагает вам использовать var во всех возможных ситуациях. Особенно раздражает, когда он рекомендует вам изменить, например, объявление int на var !

Однако, если вы не отключите эту функцию, вы получите меньше шума "от Resharper, чем больше вы используете var .

3
ответ дан 3 December 2019 в 01:04
поделиться

Нет. Используйте var там, где это улучшает читаемость, и наоборот.

2
ответ дан 3 December 2019 в 01:04
поделиться

var - это функция C # 3.x +, не так ли? без этого ваш код также будет более совместим с другими версиями.

И есть много интересных вопросов в SO, когда вы ищете " var C # "

2
ответ дан 3 December 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: