문제
초기화 없이 배열에 값을 할당하는 것이 어떻게 가능합니까?
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-us/library/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은 동일합니다.
허용되기 때문에 단순히 그렇게 할 수 있습니다. 두 단계로 그렇게하는 것은 필요하지 않으므로 이것은 속기입니다. 설탕을 고려하십시오.