سؤال

ولدي فئة في C # يحتوي على قاموس، التي أريد إنشاء وضمان أي شيء كما أضاف، تحرير أو إزالتها من هذا القاموس طالما أن الطبقة التي تحتوي كان موجودا.

وللقراءة فقط لا تساعد حقا، مرة واحدة أنا جربت ورأيت أنني يمكن إضافة عناصر بعد. فقط على سبيل المثال، أنا خلق مثال:

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 Framework لمساعدتك هنا، ولكن <لأ href = "https://cuttingedge.it/blogs/steven/pivot/entry.php؟id=29" يختلط = "نوفولو noreferrer" > هذا المنصب يعطي تنفيذ جيدة من ReadOnlyDictionary عام في C #. وتنفذ كل الواجهات التي قد تتوقع أن (IDictionary، ICollection، IEnumerable، الخ)، وعلى سبيل المكافأة، وفئة كاملة وأعضائها وعلق تماما مع XML.

و(لقد امتنعت عن نشر الشفرة هنا، لأنه حقا طويلة جدا مع جميع التعليقات XML).

نصائح أخرى

وإخفاء قاموس تماما. مجرد توفير طريقة الحصول على الدرجة DictContainer يقوم باسترداد العناصر من القاموس.

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];
    }
}

وإيه ... ثم لا تحدد طريقة إضافة ...

والحفاظ على myDictionary المتغير الخاص وفضح حاصل / مفهرس بحيث يمكن قراءتها فقط من خارج تلك الفئة ..

يتساءل اذا كان هو مفقود تماما على هذه النقطة

وليس هناك طريقة مضمنة للقيام بذلك، النظر في استخدام ل فئة المجمع.

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 الحل إن شاء subclasses ترث، الذي يحصل على عمل ذلك بطريقة أكثر أناقة.

ولمعلوماتك، والآن بنيت في ذلك لصافي 4.5.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top