2010-03-29 3 views

답변

29

불변의 타입은 초기화 할 때에 만 속성을 설정할 수있는 타입입니다. 오브젝트가 작성되면 더 이상 변경할 수 없습니다. 변경할 수없는 속성은 읽기 전용 속성 일뿐입니다.

다음 예제에서 ImmutableType은 하나의 속성이 Test 인 변경 불가능한 유형입니다. 테스트는 읽기 전용 속성입니다. 건설시에만 설정할 수 있습니다. 주제에 The Wikipedia articlesome StackOverflow questions :

class ImmutableType 
{ 
    private readonly string _test; 
    public string Test 
    { 
     get { return _test; } 
    } 

    public ImmutableType(string test) 
    { 
     _test = test; 
    } 
} 

참조하십시오.

+4

당신은 읽기 전용으로 _test 접두사에 의해 미래의 급 변화에 대한 불변성을 적용 할 수 있습니다. 슬프게도 C#에는 불변의 자동 구현 속성이 없습니다. –

+0

@Sam : 감사합니다. 예제를 업데이트했습니다. – fretje

+3

속성이 참조 유형일 때 약간 번쩍입니다. 정의는, 다음, 불변의 * 참조 *로 해석 될 수있는 것은 *는 불변하는 * 객체 그래프 _or_ 변경할 수 없습니다 (필요에 따라하지만, 일반적으로는 후자의 - 위키 문서를 참조하십시오). –

4

fretje입니다. 불변 형의 가장 보편적 인 예는 C#의 string 개체입니다. 이것은 StringBuilder이 존재하는 모든 이유입니다.

3

위의 @ fretje의 대답 외에도 C# 6 이상에서는 getter-only auto properties이 구현되어 추가 명시적인 private readonly 뒷받침 필드 없이도 변경할 수없는 자동 속성이 허용됩니다. 등가 코드로 축약 될 것이다 :

class ImmutableType 
{ 
    public string Test 
    { 
     get; // No Set at all, not even a private set. 
    } 

    public ImmutableType(string test) 
    { 
     Test = test; // The compiler understands this and initializes the backing field 
    } 
} 

private set이 (불변성에 가장 가까운 C#을 이전 버전의 자동 속성을 사용하여 얻을 수)는 같은 클래스 내에서 속성에 변화의 제한 캡슐화를 제공, 불변성에 대한

public string Test 
{ 
    get; 
    private set; // Not immutable, since this is still mutable from within the class 
} 

다른 사람들이 말했듯이

, immutable Property이 속성은

: 따라서 진정으로 변경할 수없는 일단 설정되면 변경할 수 없습니다. '유일한 값'설정은 일반적으로 생성자에서 수행됩니다.

immutable Type은 모든 (외부에서 볼 수있는) 속성 및 필드가 불변 인 유형입니다. 예를 들어 원래 C# 7에 대해 예약 된 "레코드"유형이 변경 불가능한 유형이었습니다. 변경 불가능 유형의 다른 예는 Tuples이며 모두 anonymous classes입니다.

변경할 수없는 필드는 C#의 readonly 키워드로 정규화되어야합니다. 다른 코드가 생성자 외부에서 필드를 변경하려고 시도하지 않도록 컴파일러에서 적용됩니다.

필드, 변수 및 속성의 불변성은 버그가있는 영역을 크게 줄이기 때문에 가능합니다 (필드는 개체의 상태를 나타내므로 필드로 변경하면 상태 수가 줄어 듭니다).

불변성의 이점은 두 개 이상의 스레드가 동일한 개체에 동시에 액세스하는 다중 스레드 프로그램에서 특히 중요합니다. 여러 개의 동시 읽기 스레드가 필드 또는 속성의 값에 안전하게 액세스 할 수 있으므로 프로그래머는 다른 스레드가 필드를 변경하는 것과 관련된 스레드 안전 문제를 염려 할 필요가 없습니다.

여러 구성된 개체로 구성된 복잡한 개체를 처리 할 때 일반적으로 변하지 않는 단점은 전체 그래프를 '한 번에 작성'해야한다는 것입니다. 이로 인해 지저분한 코드가 생성 될 수 있습니다.여기서 일반적인 솔루션은 과도 할 수있는 발판으로서 Builder pattern를 사용하는 것, 가변 표현 단계에서 건설 될 다음 최종 불변 오브젝트 .Build() 최종 단계에서 얻어진다.

관련 문제