2016-08-30 5 views
2

저는 개발중인 앱을 검토 중이며 변경 불가능 성을 많이 사용합니다. 나는 getter 전용 자동 특성이 C# 6.0에 있음을 발견 했으므로이를 사용하도록 리팩터링하고 있습니다. 예를 들어 List<T> 개체로 다시 캐스팅 될 가능성을 피하기 위해 공개 속성을 통해 이라는 개체를 private IList<T> 개체로 노출하고있는 곳에서 하나의 가능한 물음표를 보았습니다.이 불변 속성을 자동 속성으로 변환 할 수 있습니까?

private IList<string> tags = new List<string>();

public IEnumerable<string> Tags => new ReadOnlyCollection<string>(this.tags);

사용자 정의 게터 이러한 유형의 자동 속성을 사용할 수있는 방법이 있습니까 ?

+1

getter에 코드가 있기 때문에 자동 속성이 될 수 없습니다. 문제는 무엇이 잘못 되었습니까? 왜 자동 재산이 필요한가요? – Sinatr

+0

자동 등록 정보가 아닌 * 일반적인 코드 스타일에 맞출 수 있을지 궁금했습니다. – James

+0

* "일반 코드 스타일"* - 자동 속성 만 사용하거나 전체 속성 만 사용하는 것은 아닙니다. Btw, getter 만 속성 * immutable *을 호출하면 매번 무언가의 ** 새 인스턴스 **가 노출되면 잘못되었다고 느낍니다. 생성자에서 해당 속성을 초기화하는 것을 고려하면 실제로 자동 속성 (getter 만 사용 가능)을 사용할 수 있습니다. – Sinatr

답변

6

불행히도, 아니요. 자동 속성은 에 게속 자나 설정자 인이없는 속성의 바로 가기입니다. 보조 노트로


: Sinatr가 제대로 코멘트에 언급, 당신은 모든 속성 호출에 ReadOnlyCollection의 새로운 인스턴스를 만들 수 있습니다. 그것은 속성에 대해 전형이 아닙니다. 대신 같은 인스턴스마다 시간을 돌아 고려 : ReadOnlyCollection은 기본 컬렉션에 변경 사항을 반영하기 때문

private IList<string> tags = new List<string>(); 
public IEnumerable<string> Tags { get; } 

public MyClass() 
{ 
    Tags = new ReadOnlyCollection<string>(this.tags); 
} 

이 작동 :

ReadOnlyCollection<T> 제네릭 클래스의 인스턴스를 항상 읽기 전용입니다. 읽기 전용 인 콜렉션은 단순히 콜렉션 수정을 막는 래퍼가있는 콜렉션입니다. 따라서 기본 컬렉션에 변경 사항이있는 경우 읽기 전용 컬렉션은 이러한 변경 사항을 반영합니다.


참고 : 생성자가 필요하다 : C 번호 필드의 초기화가 the compiler might rearrange the initialization order 때문에, 다른 인스턴스 필드를 참조 할 수 없다. 필드가 나타나는 순서대로 초기화되는 VB.NET에서는 다음과 같이 작성할 수 있습니다.

Private tagList As New List(Of String)() 
Public ReadOnly Property Tags As IEnumerable(Of String) = New ReadOnlyCollection(Of String)(tagList) 
+0

아니요,하지만 제안 된 개선 사항이 나에게 예라고 말합니다. ;) 물론 의미 상 동일하지는 않지만 OP의 구체적인 경우에는 '예, 이렇게'라고 말할 수 있다고 생각합니다. – Joren

+0

@Joren : 개선 된 경우에도 여전히 명시적인 "지원 필드"가 필요합니다. 'private IList tags = new List ();'- 명시 적으로 하나의 *와 * 암시 적으로 하나가 있습니다. 나는 이것을 강조하기 위해 나의 대답에 두 번째 줄을 추가했다. – Heinzi

+0

네가 맞아, 나는 그 질문을 오해 한 것 같아. – Joren

관련 문제