Использование var и default для объявления в C # - PullRequest
10 голосов
/ 06 сентября 2011

Недавно я видел человека, активно использующего ключевые слова 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 в C # , Использование типа "var" в объявлении переменных и https://stackoverflow.com/questions/633474/c-do-you-use-var,однако, думаю, что этот вопрос, хотя и связан, немного отличается, поскольку он касается только объявления / инициализации, а не назначения.
- Я понимаю разницу между фрагментами 2 и 3. Фрагментом, однако, вопрос больше касается фрагмента 1.
- Если вы сильно чувствуете, что этот вопрос принадлежит программистам stackexchange, не стесняйтесь двигаться.

Ответы [ 5 ]

8 голосов
/ 06 сентября 2011

Я не собираюсь ничего говорить о "var", в прошлом были комментарии и дискуссии по этому поводу (достаточно; -)

Относительно "default ()" Я бы не использовал это для инициализации известного типа, а скорее только в обобщениях. Там это помогает прозрачно обрабатывать типы значений или ссылочные типы, позволяя предоставить значение по умолчанию (возвращаемое) или может использоваться в сравнениях.

4 голосов
/ 06 сентября 2011

Что ж, ключевое слово default не самое популярное ключевое слово, я думаю, и, на мой взгляд, оно лучше всего подходит для общих целей, например:

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 немного прост, но с точки зрения рефакторинга и взаимодействия классов, я нашел это очень полезным.

2 голосов
/ 06 сентября 2011

Я думаю, что это плохая практика, которая не позволяет компилятору (и сторонним инструментам) отлавливать ошибки, связанные с неудачной инициализацией переменной. Обычно я стараюсь сохранять декларацию и назначение как можно ближе друг к другу. Присвоение значений, которые не предназначены для использования переменными, может потенциально привести к появлению незначительных ошибок, которые трудно уловить. Обычно я бы либо:

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 в основном бессмысленно.

0 голосов
/ 06 сентября 2011

Код в порядке.

Просто убедитесь, что вы не копируете этот метод для инициализации перечислений, где 0 не является значением по умолчанию или flagged перечисления.

[Flags]
public enum MyFlags
{
    Test = 1,
    Test2 = 2
}

MyFlags flags = default(MyFlags);
Console.WriteLine(flags); // oops
0 голосов
/ 06 сентября 2011

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

...