Мне действительно интересно узнать, в чем разница между этими строками?
//with curly braces
int[] array2 = { 1, 2, 3, 4, };
//with brackets
int[] array3 = [1, 2, 3, 4,];
Console.WriteLine(array2[1]);
Console.WriteLine(array3[1]);
//the output is the same.
Я хочу знать, в чем разница между использованием фигурных скобок и скобок при инициализации значений.
@Sweeper: Даже для массивов вы можете использовать оператор распространения в выражениях коллекции, чего нельзя сделать в обычных инициализаторах массива.
@JonSkeet Я говорил конкретно о примере в вопросе. Я думал о том, как инициализаторы коллекций понижаются по-другому, чем выражения коллекций. Например, выражения коллекции будут пытаться найти «метод создания» в целевом типе.
@Sweeper: Я думаю, что пример в вопросе действительно неудачен - он привлекает слишком много внимания к тому случаю, когда последняя часть вопроса более интересна. Это все равно, что сказать: «В чем разница между double x = 1.5f;
и double x = 1.5d;
- они одинаковые, но double x = 1.4f;
и double x = 1.4d;
разные. (И ваш комментарий легко можно прочитать как «конкретно для массивов нет разницы между фигурными и квадратными скобками» .)
Это легко, фигурные скобки - { }
- инициализатор коллекции - Добавьте метод , квадратные скобки - [ ]
- выражение коллекции - Создайте метод.
@Sinatr: Нет, фигурные скобки не всегда являются инициализатором коллекции. Пример в этом вопросе — это не инициализатор коллекции, а инициализатор массива. (Инициализаторы коллекций встречаются только в контексте оператора new
.)
@JonSkeet, да, это не так просто: массивы — это коллекции (ICollection
), но не коллекции, у них особый альтернативный синтаксис и он не имеет ничего общего с инициализатором коллекции =D
В приведенном вами примере они означают одно и то же. Но выражения-коллекции в целом более гибкие. В частности:
Например:
ImmutableList<int> x = [0, .. Enumerable.Range(100, 5), 200];
Это создает неизменяемый список целых чисел со значениями 0, 100, 101, 102, 103, 104, 200.
Обратите внимание, что хотя инициализаторы коллекций также можно использовать для инициализации типов коллекций, не являющихся массивами, несколько гибким способом, они более ограничены, чем выражения коллекций, и по-прежнему требуют части new
. Так, например:
// Valid
List<int> x = new() { 1, 2, 3 };
// Not valid
List<int> x = { 1, 2, 3 };
// Not valid (collection initializers assume mutability)
ImmutableList<int> x = new() { 1, 2, 3 };
Выражения-коллекции решают обе эти проблемы.
Вероятно, также стоит упомянуть, что инициализаторы коллекций — это старая функция, а выражения коллекций — новая функция, поэтому один из них — «старый способ», а другой — «новый способ», хотя оба поддерживаются.
Я не думаю, что эти два выражения для массивов чем-то отличаются, но они могут сильно отличаться при инициализации других типов.