Вопрос

Как можно без инициализации присваивать значения массивам?

string[] s={"all","in","all"};

I mean why did not the compile show error?.Normally we need to 
initialize ,before assign values.
Это было полезно?

Решение

Это просто синтаксический сахар.

Этот:

string[] s = {"all","in","all"};

компилируется в тот же код, что и:

string[] tmp = new string[3];
tmp[0] = "all";
tmp[1] = "in";
tmp[2] = "all";
string[] s = tmp;

Обратите внимание, что ссылка на массив не присваивается s пока все элементы не будут назначены.Это не важно в данном конкретном случае, когда мы объявляем новый переменная, но в этой ситуации она будет другой:

string[] s = { "first", "second" };
s = new string[] { s[1], s[0] };

То же самое относится и к инициализаторам объектов и коллекций — переменная назначается только в конце.

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

Можно объявить переменную массива без инициализации.

Проверьте это http://msdn.microsoft.com/en- нас / библиотека / 0a7fscd0% 28VS.71% 29.aspx

Вы не "присваиваете значение массиву". Вы инициализируете переменную типа " ссылка на массив " ;. Значение, с которым вы его инициализируете, является ссылкой на массив, который был создан с использованием короткого синтаксиса инициализатора массива {...} . Хотя это допустимо только в инициализаторе переменных типа массива, оно в точности эквивалентно new T [] {...} , где T выводится из типа переменной .

Я думаю, ты хочешь знать, почему

 string[] s={"all","in","all"};

работает, когда вы ожидаете, что вам потребуется сначала инициализировать массив следующим образом:

string[] s = new string[];

или

string[] s = new string[] {"all","in","all"};

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

Часть {"all", "in", "all"} является инициализацией. часть new string [] может быть опущена, потому что фигурные скобки и строка являются краткими обозначениями. Посмотрите MSDN в одномерных массивах.

string[] s = new string[] { "all","in","all"};

и его сокращенная версия

string[] s = {"all","in","all"};

это одно и то же. См. MSDN (раздел «Инициализация массивов») для получения дополнительной информации. деталь.

Вам не нужна новая строковая часть [] в C # 3 или выше - это прекрасно работает

string[] s = { "all","in","all"};

Это просто тот случай, когда компилятор немного умнее и понял, что вы имеете в виду - бэкэнд IL будет таким же.

Вы можете сделать это просто потому, что это разрешено, делать это в два этапа не нужно, так что это сокращение. Считайте, что это сахар.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top