Почему С# 4.0 допускает конечную запятую в коде инициализации анонимных объектов?
Возможный дубликат:
Инициализация инициализации и конечная запятая
Работа над одним из моих проектов (С# 4.0, Visual Studio 2010), я случайно обнаружил, что этот код похож на
var obj = new { field1 = "Test", field2 = 3, }
скомпилируется и выполняется ОК без каких-либо ошибок или даже предупреждений и работает точно так же, как
var obj = new { field1 = "Test", field2 = 3 }
Почему компилятор терпит конечную кому в первом примере? Это ошибка в компиляторе или такое поведение имеет определенную цель?
Спасибо
Ответы
Ответ 1
Чтобы определить, является ли это ошибкой в компиляторе, вам нужно посмотреть на спецификацию С# - в этом случае раздел 7.6.10.6, который явно позволяет:
anonymous-object-creation-expression:
new anonymous-object-initializer
anonymous-object-initializer:
{ member-declarator-listopt }
{ member-declarator-list , }
Нет, это не ошибка компилятора. Язык был преднамеренно разработан, чтобы позволить ему.
Теперь о том, почему язык был разработан таким образом - я считаю, что он упрощает добавление и удаление значений при кодировании. Например:
var obj = new {
field1 = "test",
field2 = 3,
};
может стать
var obj = new {
field2 = 3,
};
или
var obj = new {
field1 = "test",
field2 = 3,
field3 = 4,
};
исключительно путем добавления или удаления строки. Это упрощает ведение кода, а также упрощает запись генераторов кода.
Обратите внимание, что это согласуется с инициализаторами массивов, инициализаторами и перечислениями коллекции:
// These are all valid
string[] array = { "hello", };
List<string> list = new List<string> { "hello", };
enum Foo { Bar, }
Ответ 2
Одна из причин, по которой конечные запятые хороши, - это из-за Source Compares. Если вы обновите исходный код и используете инструмент сравнения источников, тогда инструмент сравнения источников отобразит только 1 строку (новое поле 3. Если не было конечной запятой, тогда сравнение источника отобразит 2 строки, потому что вам нужно было добавить запятую после номера 3.
var obj = new {
field1 = "Test",
field2 = 3,
}
var obj = new {
field1 = "Test",
field2 = 3,
field3 = "New",
}
Ответ 3
Чтобы облегчить удаление последнего поля, я полагаю. В этом синтаксисе нет никакой двусмысленности, поэтому это просто облегчает жизнь.