C #의 OOP에 대한 "모범 사례"질문이 있지만 모든 언어에 적용됩니다.
속성 접근자를 통해 공개 될 객체가있는 라이브러리 클래스를 갖는 것을 고려하지만, 우리는 일반인 (이 라이브러리 클래스를 사용하는 사람들)이 라이브러리 클래스를 변경하는 것을 원하지 않습니다.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
분명히 가장 좋은 방법은 "옵션 C"이지만 ReadOnly 변형이있는 객체는 거의 없습니다 (그리고 사용자 정의 클래스도 없습니다).
당신이 클래스 A의 사용자라면,
List<string> someList = ( new A() ).Items;
원본 (A) 객체로 전파 하시겠습니까? 아니면 주석 / 문서로 작성된 복제본을 반환해도 괜찮습니까? 이 클론 접근 방식은 추적하기 어려운 버그로 이어질 수 있다고 생각합니다.
C ++에서는 const 객체를 반환 할 수 있으며 const로 표시된 메소드 만 호출 할 수 있다는 것을 기억합니다. C #에 그러한 기능 / 패턴이 없다고 생각합니까? 그렇지 않은 경우 왜 포함하지 않습니까? 나는 그것이 const 정확성이라고 믿습니다.
그러나 다시 나의 주요 질문은 "무엇을 기대 하느냐"또는 옵션 A와 B를 처리하는 방법에 관한 것입니다.