Присвоение значения в C # - PullRequest
0 голосов
/ 21 октября 2009

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

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

I mean why did not the compile show error?.Normally we need to 
initialize ,before assign values.

Ответы [ 8 ]

6 голосов
/ 21 октября 2009

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

Это:

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

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

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

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

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

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

3 голосов
/ 21 октября 2009

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

3 голосов
/ 21 октября 2009

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

Проверьте это http://msdn.microsoft.com/en-us/library/0a7fscd0%28VS.71%29.aspx

2 голосов
/ 21 октября 2009

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

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

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

string[] s = new string[];

или

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

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

1 голос
/ 21 октября 2009

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

1 голос
/ 21 октября 2009

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

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

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

1 голос
/ 21 октября 2009

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

1 голос
/ 21 октября 2009
string[] s = new string[] { "all","in","all"};

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

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

это то же самое. Подробнее см. MSDN (раздел Инициализация массивов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...