Использование var и default для объявления в С#
Недавно я увидел человека, сильно использующего слова var и default для объявления переменных (и для каждого объявления), примерно так:
var employee = default(Employee); //Employee is a class
var errorInfo = default(ErrorInfo); //ErrorInfo is struct; Blank is default value
var salary = default(Double);
var isManager = default(Boolean?);
вместо использования:
Employee employee = null; //Employee is a class
ErrorInfo errorInfo = Blank; //ErrorInfo is struct; Blank is default value
Double salary = 0.0;
Boolean? isManager = null;
или вместо использования четного:
Employee employee; //Employee is a class
ErrorInfo errorInfo; //ErrorInfo is struct; Blank is default value
Double salary;
Boolean? isManager;
Теперь использование var и default для объявления для каждой переменной - это то, к чему я не привык.
Хотите знать:
- Если это рекомендуемая практика?
- Ваши взгляды и предпочтения?
PS:
- Прошли Использование ключевого слова var в С#, Использование "var" тип объявления переменной и https://stackoverflow.com/info/633474/c-do-you-use-var, однако полагают, что этот вопрос, хотя и имеет отношение, несколько отличается, поскольку он касается только объявления/инициализации, а не назначения.
- Я понимаю разницу между отрывом 2 и фрагментом 3. Однако вопрос больше связан с фрагментом 1.
- Если вы сильно чувствуете, что этот вопрос принадлежит программистам, то stackexchange не стесняется двигаться.
Ответы
Ответ 1
Я ничего не скажу о "var", в прошлом были комментарии и дискуссии об этом (достаточно, -)
Относительно "default()" Я бы не использовал это для инициализации известного типа, а скорее только в generics. Там он помогает прозрачно обрабатывать типы значений или ссылочные типы, позволяя вам предоставлять значение по умолчанию (возврат) или может использоваться в сравнении.
Ответ 2
Ну, ключевое слово default
не является наиболее используемым ключевым словом, я думаю, и, на мой взгляд, он служит своей цели лучше всего с точки зрения Generics, например:
public class Foo<T>{
private T _instance;
public Foo<T>(){
_instance = default(T);
}
}
чтобы получить новый экземпляр по умолчанию для T.
На самом деле нет причин использовать его, как сценарий 1 в вашем сообщении.
Использование var
, однако, является другим вопросом, и многие рассматривают это как вопрос удобочитаемости. Я по умолчанию var
, когда пишу код просто потому, что мне легче читать:
var me = new Person();
Кажется немного избыточным с точки зрения удобочитаемости
Person me = new Person();
В другом случае я рекомендую var
, если что-то изменится. Рассмотрим следующий пример:
public decimal Calculate(decimal one, decimal two){
return one + two;
}
И где-то еще в вашем коде:
decimal d = Calculate(1M, 2M);
Если вы по какой-то причине измените тип возврата Calculate
на, скажем, double
, вам нужно изменить все места, где вы решительно определили переменную.
Если вы делаете
var d = Calculate(1M, 2M)
вам не нужно беспокоиться об этом. Пример Double/Decimal немного прост, но с точки зрения рефакторинга и взаимодействия между классами я нашел это очень полезным.
Ответ 3
Я думаю, что это плохая практика, которая помешает компилятору (и сторонним инструментам) улавливать ошибки, связанные с невозможностью инициализации переменной. Как правило, я стараюсь, чтобы объявление и назначение как можно ближе друг к другу. Присвоение значений, которые не предназначены для использования в переменных, потенциально может привести к тонким ошибкам, которые трудно поймать. Обычно я либо:
SomeType variable1; //want to store something that will be out of scope later
using(blah)
{
//...
variable1=blah;
}
//use variable1 here
или немедленно присвойте требуемое значение:
SomeType variable2 = new SomeType();
//use variable2 immediately
или (для меня, более часто в настоящее время)
var variable2 = new SomeType();
присвоение значений null/placeholder в основном бессмысленно.
Ответ 4
Я использую var для назначения. Однако я всегда объявляю экземпляры, используя класс. Я вообще также создаю их в то время, чтобы избежать неожиданных NullReferenceExceptions
Ответ 5
Код в порядке.
Просто убедитесь, что вы не копируете этот метод для инициализации перечислений, где 0
не является значением по умолчанию или flagged
перечислениями.
[Flags]
public enum MyFlags
{
Test = 1,
Test2 = 2
}
MyFlags flags = default(MyFlags);
Console.WriteLine(flags); // oops