Вопрос
Как можно без инициализации присваивать значения массивам?
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 будет таким же.
Вы можете сделать это просто потому, что это разрешено, делать это в два этапа не нужно, так что это сокращение. Считайте, что это сахар.