C # инициализирующие переменные - PullRequest
0 голосов
/ 31 августа 2011

Я программирую на c # в VS2010 и тестирую плагин под названием ReSharper. По своему опыту я чувствую, что он очищает код и упрощает ненужную логику. Однако одна из основных проблем, которую он обнаруживает во всем моем коде, - это когда я инициализирую переменные.

Resparper рекомендует инициализировать с помощью "var"

int i = 0  ----> var i = 0
           or...
MyClass1 MyClass = new MyClass(1)

Я всегда думал, что использование var имеет небольшие накладные расходы и выглядит довольно лениво или слабо (хотя я понимаю, что у него есть некоторые преимущества). У меня возникли проблемы, пытаясь найти, если есть веская причина для инициализации переменных, как это. Reshaper говорит, что использование вара является спорным вопросом, но он имеет хорошие дополняющие использовать для инициализации. Кто-нибудь знает, что это может или не может быть?

Ответы [ 6 ]

7 голосов
/ 31 августа 2011

Явное использование типа переменной vs var - это вопрос предпочтений.Вы можете отключить его в Resharper.

enter image description here

5 голосов
/ 31 августа 2011

Если это лень, то я не хочу быть продуктивным.

Dictionary<int, Dictionary<string, string>> map = 
    new Dictionary<int, Dictionary<string, string>>();

var map = new Dictionary<int, Dictionary<string, string>>();
3 голосов
/ 31 августа 2011

var не имеет никаких накладных расходов времени выполнения и довольно минимальных накладных расходов времени компиляции. Код IL, который он генерирует, фактически эквивалентен, если вы используете явный тип. Предпочитаете ли вы использовать его или нет, это полностью вопрос предпочтений. Я лично настроил Resharper не беспокоить меня, если только инициализация не сделает тип очевидным:

Person p = new Person(); // Resharper bugs me
int i = 0; // Resharper leaves this alone.
3 голосов
/ 31 августа 2011

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

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

2 голосов
/ 31 августа 2011

Дело в том, что когда вы присваиваете переменную с прямым использованием new Classname(...), вы четко и однозначно знаете окончательный тип переменной, потому что просто вызываете конструктор.

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

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

, но в конце концов это почти философский вопрос: D

1 голос
/ 31 августа 2011

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

var x; // invalid because x is still statically typed 

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

...