C#의 변경 불가능한 유형 및 변경 불가능한 속성은 무엇을 의미합니까? 간단한 예를 들어 줄 수 있습니까?C#의 변경 불가능한 유형 및 속성
답변
불변의 타입은 초기화 할 때에 만 속성을 설정할 수있는 타입입니다. 오브젝트가 작성되면 더 이상 변경할 수 없습니다. 변경할 수없는 속성은 읽기 전용 속성 일뿐입니다.
다음 예제에서 ImmutableType
은 하나의 속성이 Test
인 변경 불가능한 유형입니다. 테스트는 읽기 전용 속성입니다. 건설시에만 설정할 수 있습니다. 주제에 The Wikipedia article 및 some StackOverflow questions :
class ImmutableType
{
private readonly string _test;
public string Test
{
get { return _test; }
}
public ImmutableType(string test)
{
_test = test;
}
}
도 참조하십시오.
fretje입니다. 불변 형의 가장 보편적 인 예는 C#의 string
개체입니다. 이것은 StringBuilder
이 존재하는 모든 이유입니다.
위의 @ 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()
최종 단계에서 얻어진다.
- 1. 변경 불가능한 클래스 구조 디자인
- 2. 취소 불가능한 변경 집합
- 3. 읽기 전용 (변경 불가능한) 직렬화 가능 클래스
- 4. 컬렉션이있는 변경 불가능한 구조체
- 5. 스칼라 변경 불가능한 변수 및 인쇄
- 6. Jackson JSON, 변경 불가능한 클래스 및 인터페이스
- 7. 변경 불가능한 하위 속성 변경을위한 기존 Javabean 지원
- 8. 런타임시 클래스 유형 변경
- 9. 변경 불가능한 모음을 변경 가능한 모음으로 변환
- 10. C++의 변경 불가능한 클래스
- 11. Silverlight 2의 변경 불가능한 스타일
- 12. JTextPane 변경 불가능한 텍스트 블록
- 13. coredata 문제 속성 유형
- 14. 웹 서비스 및 속성 유형
- 15. 개체 유형 속성과 인터페이스를 구현하는 클래스에서 속성 유형 변경
- 16. Objective-C의 속성 및 인스턴스 변수
- 17. Objective-C의 MVC 및 속성 용어집
- 18. 여러 설명 c의 속성
- 19. 매크로가있는 C의 유형 크기 확인
- 20. Objective-C - 내부의 변경 불가능한 선언 - 범위 및 메모리 관리?
- 21. 변경 불가능한 인스턴스 만들기 및 관용적 인 방법으로 복사본 수정
- 22. 변경 불가능한 클래스 및 화합 응용 프로그램 블록
- 23. C의 char 유형 값 범위
- 24. 비즈니스 응용 프로그램의 변경 불가능한 클래스
- 25. 변경 불가능한 사전 <TKey, TValue>
- 26. Objective-C의 읽기 전용 속성?
- 27. 변경 가능한 테이블을 참조하는 변경 불가능한 테이블을 처리하는 방법은 무엇입니까?
- 28. NHibernate에 - 프로젝션 및 참조 유형 속성
- 29. INotifyPropertyChanged를 사용한 Nullable 유형 및 속성
- 30. 변경 속성
당신은 읽기 전용으로 _test 접두사에 의해 미래의 급 변화에 대한 불변성을 적용 할 수 있습니다. 슬프게도 C#에는 불변의 자동 구현 속성이 없습니다. –
@Sam : 감사합니다. 예제를 업데이트했습니다. – fretje
속성이 참조 유형일 때 약간 번쩍입니다. 정의는, 다음, 불변의 * 참조 *로 해석 될 수있는 것은 *는 불변하는 * 객체 그래프 _or_ 변경할 수 없습니다 (필요에 따라하지만, 일반적으로는 후자의 - 위키 문서를 참조하십시오). –