2012-01-25 1 views
2

A recent question here сделал использование default ключевого слова в необщего код, который меня интересует:Назначение и использование ключевого слова «по умолчанию» в не-дженериков

StreamReader r = default(StreamReader); 

Что подается здесь цель? Как это отличается от:

StreamReader r; 

Оба утверждения определяют r. В ответе «SLaks» ниже он поясняет, что использование default дополнительно устанавливает r на null, но это можно сделать явно, используя только null. Это проблема стиля, или есть какая-то утилита?

Я использовал default in generic code (и, конечно, in switch statement blocks), но не понимаю, в чем его цель.

ответ

3

Он отличается от StreamReader r; тем, что он назначает переменную. Это (полностью) идентично StreamReader r = null;.

Для ссылочных типов default(T) компилируется в null.
Для значений типов default(T) компилируется в new T().

C# default(T) ключевое слово is actually equivalent to VB.Net's Nothing keyword.

+0

Право. Я получил то, что читал в другом месте. Какова цель написания «null» в этом многословном ключе? –

+0

@KevinR: Нет. Они компилируются одинаково. – SLaks

+0

Итак, вы говорите, что это всего лишь выбор стиля. За исключением того, что я читал в другом месте, что автоматически сгенерированные шаблоны кода могли бы выводить такой код, но я бы предположил, что он был написан вручную в S.O. вопрос, с которым я связан (где я видел этот код). Любая догадка, почему вы предпочитаете такой стиль? Кажется слишком явным способом просто сказать «null». –

4

Выражение default(T) создает значение по умолчанию для типа generic или нет. Для ссылочных типов это будет null, а для типов значений это будет инициализация 0. Хотя он наиболее полезен в общем коде, он по-прежнему можно использовать, если он часто многословный, в обычном коде.

Например. Следующие группы линий эквивалентны.

StreamReader r = null; 
StreamReader r = default(StreamReader); 
var r = default(StreamReader); 

int i = 0; 
int i = default(int); 
var i = default(int); 
+0

Тот же комментарий к SLaks ниже - Вы говорите, что это всего лишь выбор стиля? Я читал в другом месте, что автоматически сгенерированные шаблоны кода могут выводить такой код, но я предполагаю, что он был написан вручную в S.O. вопрос, с которым я связан (где я видел этот код). Любые рассуждения, почему вы предпочитаете такой стиль? Кажется слишком явным способом просто сказать «null». –

+0

@KevinP.Райс. Конечно, для генераторов кода, конечно, необходимо сделать выбор, поскольку он более универсален. Но в его основе это выбор стиля (который вы бы никогда не поймали меня, хотя). – JaredPar

0

var r = default (StreamReader); может иметь некоторый смысл, особенно если вы пытались разработать привычку кодирования. Помимо этого единственное преимущество, которое я мог видеть, заключается в том, что в какой-то момент в будущем по умолчанию StreamReader может быть недействительным, что кажется маловероятным .....

+0

Это не просто маловероятно; Этого никогда не случится. – SLaks

+0

Это ИТ. Вы никогда не будете использовать до 640 тысяч. Дается изменение. BeSides Я намекал на мысль о глупости. –

Смежные вопросы