指针可以与Dictionary <tkey,tsource>?</tkey,tsource>一起使用

时间:2011-09-27 17:40:17

标签: c# pointers

假设我有以下课程:

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

我希望能够获得指向存储在Dictionary中的值的指针,这样我就可以直接获取和设置值(是不安全的)而无需等待Dictionary来搜索元素每次关键。

有没有办法在c#中做到这一点?

3 个答案:

答案 0 :(得分:1)

不,不,不,不。

string由于某种原因是不可变的。多个引用之间可能共享string:使用不安全的代码直接修改它可能会导致奇怪的行为。

解决这个问题的方法是编写一个旧的值包装类,并保留对该包装器实例的引用。然后,getter和setter将修改包装器的属性。

答案 1 :(得分:1)

不,我不相信。你可以在字典中存储一个可变的包装器:

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

然后创建字典(顺便说一句,它应该是私有的 - 公共字段除了常量之外是一个非常糟糕的主意)作为Dictionary<string, Wrapper<string>>。然后,您可以保留与Wrapper<string>"FirstAttribute"相关联的"SecondAttribute"个字段的字段。

坦率地说,我认为这不是一个特别好的主意 - 我只是坚持使用字典查找 - 但这是一个选择。 (假设没有什么会改变哪个包装器与键相关联。)

另一种选择只是使用两个特定属性的字段 - 当您被要求设置新值时,在字典中设置它并设置字段。当您被要求输入当前值时,只需返回字段中的值即可。当然,这是假设你控制了字典(即它不能在课堂外改变)。

答案 2 :(得分:0)

如果字典中的值是可变的,您可以获取对它们的引用并对它们进行修改。但字符串是不可变的。因此字典有自己的字符串引用副本,并且您无法更改它指向的字符串。如果您尝试将其替换为另一个字符串,则需要使用新引用更新字典。所以基本上没有办法改善你在这种情况下所拥有的东西。

相关问题