문제

C#에는 사전이 포함 된 클래스가 있습니다.이 사전은 포함 된 클래스가 존재하는 한이 사전에서 추가, 편집 또는 제거 된 것과 아무것도 보장하지 않습니다.

일단 테스트하고 이후에 항목을 추가 할 수 있다는 것을 알았을 때 Readonly는 실제로 도움이되지 않습니다. 예를 들어, 예를 만들었습니다.

public class DictContainer
{
    private readonly Dictionary<int, int> myDictionary;

    public DictContainer()
    {
        myDictionary = GetDictionary();
    }

    private Dictionary<int, int> GetDictionary()
    {
        Dictionary<int, int> myDictionary = new Dictionary<int, int>();

        myDictionary.Add(1, 2);
        myDictionary.Add(2, 4);
        myDictionary.Add(3, 6);

        return myDictionary;
    }

    public void Add(int key, int value)
    {
        myDictionary.Add(key, value);
    }

}

추가 방법이 작동하지 않기를 바랍니다. 가능하다면 컴파일하지 않기를 원합니다. 제안이 있습니까?

사실, 나는 그것이 많은 사람들이 바꿀 수있는 코드라고 걱정합니다. 따라서 ADD 메소드를 숨기더라도 누군가가 키를 추가하는 메소드를 "무고하게"만들거나 다른 방법을 제거 할 수 있습니다. 나는 사람들이 어떤 식 으로든 사전을 바꾸지 않아야한다는 것을보고 알고 싶어합니다. const 변수와 마찬가지로.

도움이 되었습니까?

해결책

.NET 프레임 워크에는 여기에서 도움이되는 것이 없지만 이 게시물 일반의 꽤 좋은 구현을 제공합니다 ReadOnlyDictionary C#에서. 예상 할 수있는 모든 인터페이스를 구현합니다 (IDictionary, ICollection, IEnumerable, 등 등) 및 보너스로서 전체 클래스와 그 회원은 XML로 완전히 댓글을 달았습니다.

(모든 XML 댓글이 매우 길기 때문에 여기에 코드를 게시하지 못했습니다.)

다른 팁

사전을 완전히 숨 깁니다. DictContainer 클래스에서 사전에서 항목을 검색하는 GET 메소드를 제공하십시오.

public class DictContainer
{
    private readonly Dictionary<int, int> myDictionary;

    public DictContainer()
    {
        myDictionary = GetDictionary();
    }

    private Dictionary<int, int> GetDictionary()
    {
        Dictionary<int, int> myDictionary = new Dictionary<int, int>();

        myDictionary.Add(1, 2);
        myDictionary.Add(2, 4);
        myDictionary.Add(3, 6);

        return myDictionary;
    }

    public this[int key]
    {
        return myDictionary[key];
    }
}

Eh ... 그럼 추가 메소드를 정의하지 마십시오 ...

보관하십시오 myDictionary 가변 개인 및 getter/indexer를 노출시켜 해당 클래스 외부에서만 읽을 수 있습니다 ..

그가 포인트를 완전히 놓치고 있는지 궁금합니다

그렇게 할 수있는 내장 방법이 없습니다. 래퍼 클래스.

interface IReadOnlyDic<Key, Value>
{
    void Add(Key key, Value value);
}
class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>, IReadOnlyDic<Key, Value>
{
    public new void Add(Key key, Value value)
    {
        //throw an exception or do nothing
    }
    #region IReadOnlyDic<Key,Value> Members

    void IReadOnlyDic<Key, Value>.Add(Key key, Value value)
    {
        base.Add(key, value);
    }

    #endregion
}

사용자 정의 항목을 추가하려면;

    IReadOnlyDic<int, int> dict = myDictInstance as IReadOnlyDic<int, int>;
    if (dict != null)
        dict.Add(1, 155);

그리고 이것은 또 다른 방법입니다

class ReadOnlyDic<Key, Value> : Dictionary<Key, Value>
{
    private bool _locked = false;

    public new void Add(Key key, Value value)
    {
        if (!_locked)
        {
            base.Add(key, value);
        }
        else
        {
            throw new ReadOnlyException();
        }
    }
    public void Lock()
    {
        _locked = true;
    }
}

나는 좋아했다 링크 ~에서 브루노 코드, 그것은 더 간단한 것이었지만 일단 그의 의견을 답으로 표시 할 수 없으면, 나는 Noldorin 공무원으로서 대답하십시오. 왜냐하면 비슷하고 만족스러운 답변이기 때문입니다.

코드가 컴파일하는 것을 막는 방법이 없다 :(. 감사합니다, 얘들 아

다음은 다음과 같이 설명했듯이 더 나은 대안입니다.

http://www.softwarerockstar.com/2010/10/..

본질적으로 그것은 훨씬 더 간단한 솔루션 서브 클래스 readonlycollection이며,이 작업을보다 우아한 방식으로 수행합니다.

참고로, 이제 .NET 4.5로 내장되어 있습니다.

http://msdn.microsoft.com/en-us/library/gg712875(v=vs.110).aspx

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