2013-06-26 2 views
1
MyClass[] CLASS = new MyClass[5]; 
int[] STRUCT = new int[5]; 

클래스와 구조체에 대해 정확히 새로운 []이 (가) 무엇입니까? 분명히 구조체에는 구조체의 기본 생성자를 실행하게하는 오버로드 된 정적 인덱스가 있습니다. 그러나 클래스에 대한 새로운 [] 클래스의 인스턴스를 초기화 할 수있는 공간을 만드는 것 같습니다. 기본 생성자를 실행하기 위해 클래스의 정적 동작을 어떻게 오버로드합니까? 나는 이것을 위해 루프와 다른 방법을 사용하는 법을 안다. 내 질문은 새로운 [] 아래에서 진행되는 것에 매우 구체적입니다. 구조체에 기본값이 필요하다는 것을 알고 있습니다. 그러나 null이 허용되지 않는 클래스도 기본 값을 필요로하지 않으므로 사용하려고하면 오류가 발생합니다. 아니면 모든 클래스가 실제로 nullable인지 알려주는 것입니까?클래스와 구조체에서 new []가 정확히 무엇입니까?

+0

: 다음 코드를 컴파일하려고하면, 당신은 당신이 말하는 컴파일 오류를받을 수 있습니까? 절대적으로 아무것도 아닌 배열? int 배열을 만들 때 그것은'struct'이기 때문에 0의 배열을 만듭니다. 그러나'class' 배열을 만들면 그것을 사용하려고 할 때 null 에러 때문에 공간을 생성합니다. 구조체는 기본 생성자를 호출하지만 클래스 인덱스가 절대적으로 아무것도 호출하지 않으면 실제 생성되는 것은 무엇입니까? 구조체에서 동작하는 것처럼 정적 인덱스를 오버로드하는 방법이 있습니까? 늘어나는만큼 새로운 CLASS []는 아무 것도하지 않고 실제 배열은 for 루프 또는 초기화하는 데 사용되는 모든 메서드에서 만들어집니다. – CodeCamper

답변

2

아니요, 기본 생성자 struct이 실행되지 않습니다. 대신에 struct의 경우 메모리가 0으로 초기화됩니다. 이것이 의미하는 바는 데이터 유형에 따라 다릅니다. 예를 들면, (클래스 나 문자열 등) 참조 필드가 null가되고, 숫자 필드는

이 클래스의 작동 방식에서 매우 차이 등 0, 부울 필드가 false하게된다. 따라서 class 배열 초기화시 null 값이 표시됩니다. 근본적으로, 그것은 이것에 온다. "빈"class 변수 (또는 케이스의 배열)는 null이됩니다. 그러나 "비어있는"경우 struct, 당신은 이미 유효한 무언가가 있습니다. 그러나 비어있는 것으로 초기화됩니다.

가장 쉽게 볼 수있는 방법은 예 : 클래스에 int 필드가 있어야합니다. 이것은 기본적으로 동일한 방식으로 작동합니다. int 필드를 클래스에 추가하면 초기화 할 필요가 없습니다. 초기화하지 않으면 기본값으로 0이됩니다. struct의 작업은 이와 관련하여 같은 방식입니다.

자세한 내용은 http://msdn.microsoft.com/en-us/library/aa664471.aspx을 참조하십시오.

몇 가지 (코멘트에서 질문에 답을) 참고 사항 :

  • 수업은 항상 널 (NULL)입니다. 즉, 배열을 초기화하는 유일한 방법은 루프를 만들고 배열의 모든 항목에 대해 새 인스턴스를 초기화하는 것입니다.
  • 기본 생성자를 가질 수 없기 때문에 기본 생성자는 구조체에 적용되지 않습니다. 무엇의 배열 @CuongLe

    struct MyStruct 
    { 
        public MyStruct() 
        { 
        } 
    } 
    
+0

모든 클래스는 null 가능합니까? for 루프 나 다른 구조체를 사용하지 않고 클래스의 배열에 대한 기본값을 만들 수없는 경우 nullable 클래스와 nullable이 아닌 클래스의 차이점은 무엇입니까? 또한 struct의 기본 생성자가 실행되지 않으면 언제 실행됩니까? – CodeCamper

+0

답변을 업데이트했습니다. –

+0

하지만 모든 구조체에 숨겨진 기본 생성자가 있습니까?부울을 false로 만들고 숫자 0을 나타내는 코드와 프로그래머가 사용할 수없는 클래스를 의미하며 실제로 언어 자체의 일부입니까? 예를 들어 호기심을 위해서 단순한 값 형식을 만들고 싶다고 가정하면 고유 한 기본값을 사용하여 C#에서는이 작업을 수행 할 수 없습니다. – CodeCamper

관련 문제