2010-05-05 2 views
4

질문은 구조체에 관한 것입니다. 구조체 타입 변수/객체 (어떤 것이 더 적합 할까?) 또는 구조체의 배열이나리스트를 선언 할 때, 객체처럼 명시 적으로 생성자를 호출해야합니까? 아니면 선언만으로 변수처럼 충분합니까?구조체의 경우 C#에서 명시 적으로 생성자를 호출해야합니까?

+0

컨테이너를 새로 만들어야하는지 (예 : 목록 ) 확인해야하는지 확실하지 않지만 대답은 '예'입니다. :) – Dave

답변

13

C#의 구조체는 생성자를 호출하거나 생성하지 않고 만들 수 있습니다. 생성자가 호출되지 않은 경우 struct의 멤버는 기본값 (기본적으로 0으로 초기화 됨)으로 초기화되고 모든 필드가 초기화 될 때까지 struct을 사용할 수 없습니다.

문서에서

:

당신이 new 연산자를 사용하여 구조체 객체를 생성

, 그것은 생성됩니다 및 적절한 생성자가 호출됩니다. 클래스와 달리 구조체는 연산자를 사용하지 않고 을 인스턴스화 할 수 있습니다. 새 필드를 사용하지 않는 경우 필드는 할당되지 않은 상태로 유지되고 필드가 초기화 될 때까지 개체를 사용할 수 없습니다.

다음은 몇 가지 예입니다 : 구조체의

struct Bar 
{ 
    public int Val; 

    public Bar(int v) { Val = v; } 
} 

public void Foo() 
{ 
    Bar z;  // this is legal... 
    z.Val = 5; 

    Bar q = new Bar(5); // so is this... 
    q.Val = 10; 

    // using object initialization syntax... 
    Bar w = new Bar { Val = 42; } 
} 

배열은 하나의 구조체 변수 다릅니다. - 당신이 참조 변수를 선언하는 구조체 형식의 배열을 선언 할 때와 같은, 당신은 new 연산자를 사용하여 할당해야합니다

Bar[] myBars = new Bar[10]; // member structs are initialized to defaults 

당신은 또한 당신의 구조체 생성자가있는 경우 배열의 초기화 구문을 사용하도록 선택할 수 있습니다 :

Bar[] moreBars = new Bar[] { new Bar(1), new Bar(2) }; 

이보다 더 정교해질 수 있습니다.

struct Bar 
{ 
    public int Val; 

    public Bar(int v) { Val = v; } 

    public static implicit operator Bar(int v) 
    { 
     return new Bar(v); 
    } 
} 

// array of structs initialized using user-defined implicit converions... 
Bar[] evenMoreBars = new Bar[] { 1, 2, 3, 4, 5 }; 
+0

저는 2 년 동안 C#으로 개발했지만 절대 사용하지 않았거나 암시 적 키워드를 발견했다고 말하기 엔 당혹 스럽습니다! – Pierreten

0

구조체는 C#에서 Value Type, 그래서 힙이 아니라 스택 메모리를 사용하여 struct가 원시적 형에서 암시 적 변환 연산자가있는 경우, 당신은 지금처럼 초기화 할 수 있습니다.

당신은

INT는 C#에서 구조체 타입, 예컨대 int a = 90; 일반적인 방법으로 구조체 변수를 선언 할 수 있습니다.

new 연산자를 사용하면 해당 생성자가 호출됩니다.