2014-01-23 5 views
6

이니셜 라이저 목록을 사용하여 struct을 작성하는 경우, 제외하는 구성원은 알려진 기본값을 갖습니까? Default Values Table (C# Reference)가 : 초기화되지 않은 구조체 멤버에 값이 보장되어 있습니까?

public struct Testing 
{ 
    public int i; 
    public double d; 
    public string s; 
} 

Testing test = new Testing { s="hello" }; 

나는 그것을 의미하지만 그렇게 명시 적으로 언급하지 않는 MS의 링크를 발견했다.

작은 테스트 프로그램은 컴파일러 오류를 생성하지 않으며 예상되는 결과를 산출 함을 보여줍니다. 나는 보증에 대한 간단한 테스트에 의존하는 것보다 낫다. http://ideone.com/nqFBIZ

답변

9

예, 기본값 (T)이 있습니다. 여기서 T는 값의 유형입니다. 개체 참조는 null입니다.

발췌 : 그들은 을 만들 때

5.2 절에서 설명한 바와 같이

변수의 여러 종류가 자동으로 기본 값으로 을 초기화됩니다. 클래스 유형 및 기타 참조 유형의 변수의 경우이 기본값은 null입니다. 그러나 구조체는 이 될 수없는 값 형식이므로 구조체의 기본값은 에 의해 생성 된 값이며 모든 값 형식 필드를 기본값으로 설정하고 모든 참조 형식은null로 설정됩니다.

여기에서 촬영 : 그들은 명시 적으로 진술하는 인증을위한 MOC를 공부할 때

http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx

나는 기억한다. 언어의 보장 된 기능입니다. PID의 대답에 확장하려면

6

:

test = new Testing { s = hello } 

가의 의미를 갖는 것으로 지정됩니다

는 값 형식의 기본 생성자이 생성자로 설명되어 있습니다
Testing temp = new Testing(); 
temp.s = "hello"; 
test = temp; 

설정하는 모든 필드를 기본값으로 설정합니다.

더 일반적으로 C# 언어는 값 형식의 어떤 생성자는 생성자가 정상적으로 종료 전에 모든 필드 확실히 할당 될 재산이 있어야합니다.

이제 생성자가 호출되지 않으면 두 가지 경우가 있습니다. 변수가 처음에으로 할당 된 이면 변수는 기본 생성자가 호출 된 것처럼 동일하게 작동합니다.당신이

Testing[] test = new Testing[1] { new Testing() }; 

말했다 것처럼 변수가 예를 들어, 처음에 할당되지 경우 예를 들어 말한다면

Testing[] test = new Testing[1]; 

그런 다음 test[0]이 같은 기본 값으로 초기화된다 지역 변수 인 경우 은 모든 필드를 읽기 전에 반드시 지정해야합니다. 즉, 로컬이있는 경우 :

Testing test; 
test.s = "hello"; 
Console.WriteLine(test.d); // ERROR, test.d has not been written yet. 

변경 가능한 구조체는 C#에서 최악의 방법입니다. 대신 모든 필드를 설정하고 필드를 비공개로 만들고 속성 getter를 그 위에 놓는 공용 생성자를 만듭니다.