Использование 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