Можно ли использовать указатели со словарем <TKey, TSource>? - PullRequest
1 голос
/ 27 сентября 2011

Допустим, у меня есть следующий класс:

    public class MyClass {
    public string FirstAttribute {
        get {
            return Attributes["FirstAttribute"];
        }
        set {
            Attributes["FirstAttribute"] = value;
        }
    }
    public string SecondAttribute {
        get {
            return Attributes["SecondAttribute"];
        }
        set {
            Attributes["SecondAttribute"] = value;
        }
    }
    public Dictionary<string, string> Attributes;
    public MyClass(Dictionary<string,string> att) {
        Attributes = att;
    }
}

и я хотел иметь возможность получить указатель на значение, которое хранится в Словаре, чтобы я мог получить и установить значения (да, небезопасные) напрямую, не дожидаясь, пока Словарь выполнит поиск элемента с помощью ключ каждый раз.

Есть ли способ сделать это в c #?

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Нет, я не верю в это.Вы можете сохранить изменяемую оболочку в словаре:

public class Wrapper<T>
{
    public T Value { get; set; }
}

Затем создайте словарь (кстати, он должен быть закрытым - публичные поля - действительно плохая идея, отличная от констант) как Dictionary<string, Wrapper<string>>.Затем вы можете оставить поля для Wrapper<string> объектов, связанных с "FirstAttribute" и "SecondAttribute".

Честно говоря, я не думаю, что это было бы особенно хорошей идеей - я бы просто придерживался словаря поиска- но это вариант.(Предполагая, что ничего не изменится, какая оболочка связана с ключами.)

Другой вариант - просто использовать поля для двух конкретных атрибутов - когда вас попросят установить новое значение, установите его в словаре и установить поле.Когда вас спросят о текущем значении, просто верните значение из поля.Конечно, это предполагает, что вы контролируете словарь (то есть он не может меняться вне вашего класса).

1 голос
/ 27 сентября 2011

Нет, нет, нет, нет.

string s являются неизменными по причине.string может быть разделен между несколькими ссылками: изменение его напрямую с помощью небезопасного кода может привести к странному поведению.

Чтобы обойти это, можно написать класс-обертку, который устаревает ваше значение, и сохранитьссылка на экземпляр этой оболочки.Получатели и установщики затем изменят свойство оболочки.

0 голосов
/ 27 сентября 2011

Если бы значения в словаре были изменяемыми, вы могли бы получить ссылку на них и изменить их. Но строки неизменны. Таким образом, словарь имеет свою собственную копию ссылки на вашу строку, и вы не можете изменить строку, на которую он указывает. Если вы попытаетесь заменить его другой строкой, вам нужно обновить словарь с новой ссылкой. Так что в принципе нет способа улучшить то, что у вас есть в этой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...