문제

나는 불변의 수업을 만들기 위해 노력하고 있습니다.
모든 속성을 읽기 전용으로 표시했습니다.

수업에 항목 목록이 있습니다.
속성이 읽기 전용이지만 목록을 수정할 수 있습니다.

목록의 ienumerable을 노출 시키면 불변이됩니다.
수업을 불변으로 만들기 위해 따라야하는 기본 규칙이 무엇인지 알고 싶었습니까?

도움이 되었습니까?

해결책

나는 당신이 올바른 길을 가고 있다고 생각합니다.

  • 클래스에 주입 된 모든 정보는 생성자에 제공되어야합니다.
  • 모든 속성은 getters 일 것입니다
  • 컬렉션 (또는 배열)이 생성자로 전달되면 발신자가 나중에 수정하지 못하도록 복사해야합니다.
  • 컬렉션을 반환하려면 사본 또는 읽기 전용 버전을 반환합니다 (예 : 사용 ArrayList.Readonly 또는 이와 유사한 - 이것을 이전 요점과 결합 할 수 있으며 가게 발신자가 액세스 할 때 반환 할 읽기 전용 사본), 열거자를 반환하거나, 컬렉션에 읽기 전용 액세스 할 수있는 다른 방법/속성을 사용하십시오.
  • 회원 중 하나라도 변이 가능한 경우 변경 사항이있을 수 있습니다.이 경우, 보유하고자하는 상태를 복사하고 복사 할 수없는 상태를 복사하지 않으면 보관하고 싶은 상태를 복사해야합니다. 발신자에게 돌려주기 전에 - 또 다른 옵션은 변한 객체의 불변 "섹션"만 반환하는 것입니다.

다른 팁

불변이 되려면 모든 속성과 필드는 준비되어 있어야합니다. 그리고 어떤 목록의 모든 항목은 그 자체로 불변이어야합니다.

다음과 같이 재시험 속성을 읽을 수 있습니다.

public class MyClass
{
    public MyClass(..., IList<MyType> items)
    {
        ...
        _myReadOnlyList = new List<MyType>(items).AsReadOnly();
    }

    public IList<MyType> MyReadOnlyList
    {
        get { return _myReadOnlyList; }
    }
    private IList<MyType> _myReadOnlyList

}

또한, 다음을 명심하십시오.

public readonly object[] MyObjects;

Readonly 키워드로 표시되어 있어도 불변이 아닙니다. 색인 액세서로 개별 배열 참조/값을 여전히 변경할 수 있습니다.

사용 ReadOnlyCollection 수업. 그것은에 위치하고 있습니다 System.Collections.ObjectModel 네임 스페이스.

목록 (또는 생성자)을 반환하는 모든 것에서 목록을 읽기 전용 컬렉션으로 설정하십시오.

using System.Collections.ObjectModel;

...

public MyClass(..., List<ListItemType> theList, ...)
{
    ...
    this.myListItemCollection= theList.AsReadOnly();
    ...
}

public ReadOnlyCollection<ListItemType> ListItems
{
     get { return this.myListItemCollection; }
}

또 다른 옵션은 내부 컬렉션을 전혀 노출시키는 대신 방문자 패턴을 사용하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top