Разница между фигурными скобками {} и скобками [] при инициализации массива в С#?

Мне действительно интересно узнать, в чем разница между этими строками?

//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 24.07.2024 09:28

@Sweeper: Даже для массивов вы можете использовать оператор распространения в выражениях коллекции, чего нельзя сделать в обычных инициализаторах массива.

Jon Skeet 24.07.2024 09:32

@JonSkeet Я говорил конкретно о примере в вопросе. Я думал о том, как инициализаторы коллекций понижаются по-другому, чем выражения коллекций. Например, выражения коллекции будут пытаться найти «метод создания» в целевом типе.

Sweeper 24.07.2024 09:37

@Sweeper: Я думаю, что пример в вопросе действительно неудачен - он привлекает слишком много внимания к тому случаю, когда последняя часть вопроса более интересна. Это все равно, что сказать: «В чем разница между double x = 1.5f; и double x = 1.5d; - они одинаковые, но double x = 1.4f; и double x = 1.4d; разные. (И ваш комментарий легко можно прочитать как «конкретно для массивов нет разницы между фигурными и квадратными скобками» .)

Jon Skeet 24.07.2024 09:41

Это легко, фигурные скобки - { } - инициализатор коллекции - Добавьте метод , квадратные скобки - [ ] - выражение коллекции - Создайте метод.

Sinatr 24.07.2024 09:45

@Sinatr: Нет, фигурные скобки не всегда являются инициализатором коллекции. Пример в этом вопросе — это не инициализатор коллекции, а инициализатор массива. (Инициализаторы коллекций встречаются только в контексте оператора new.)

Jon Skeet 24.07.2024 09:56

@JonSkeet, да, это не так просто: массивы — это коллекции (ICollection), но не коллекции, у них особый альтернативный синтаксис и он не имеет ничего общего с инициализатором коллекции =D

Sinatr 24.07.2024 11:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
7
988
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В приведенном вами примере они означают одно и то же. Но выражения-коллекции в целом более гибкие. В частности:

  • Они могут создавать экземпляры коллекций, отличных от массивов.
  • Они могут использовать оператор расширения для включения последовательностей

Например:

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 };

Выражения-коллекции решают обе эти проблемы.

Вероятно, также стоит упомянуть, что инициализаторы коллекций — это старая функция, а выражения коллекций — новая функция, поэтому один из них — «старый способ», а другой — «новый способ», хотя оба поддерживаются.

nateirvin 30.07.2024 23:01

Другие вопросы по теме

Добавьте пробел после указанных данных, используя регулярное выражение в Visual Studio
Назначение одного и того же идентификатора модели пользовательского приложения приложению WinForms и приложению VB6
Регистрация цвета с помощью QuillJS
Как добавить числа общего типа
ASP.NET Core 8: одноэлементный шаблон с HttpContextAccessor не работает вместе
Получение имени пользователя Windows в формате «Имя Фамилия», когда пользователь является частью группы
Миграция с Polly на Microsoft.Extensions.Http.Resilience — расширение долженхандле
Попытка подключиться к базе данных SQL — поставщик: поставщик TCP, ошибка: 26 — ошибка при обнаружении указанного сервера/экземпляра
Загрузите несколько файлов как IEnumerable<IFormFile> и отправьте дополнительную информацию о файлах в формате JSON в запросе HTTP POST
Убедитесь, что задачи dotnet останавливаются, когда они выходят за пределы области сборщика мусора