【问题标题】:Get value from dictionary as reference从字典中获取值作为参考
【发布时间】:2014-06-19 08:24:02
【问题描述】:

我目前对 C# 字典很感兴趣。我正在尝试为使用字典编写缓存,但我似乎无法让它工作:

class Program
{
    static Dictionary<int, Value> dict;

    static void Main(string[] args)
    {
        dict = new Dictionary<int,Value>();
        Value v = new Value() { Hello = 1, Bye = "QWERTY"};
        dict.Add(1, v);
        Value c = dict[1];
        Console.WriteLine(c.Bye);
        dict[1] = new Value() { Hello = 2, Bye = "ASDF" };
        Console.WriteLine(c.Bye);
    }
}

class Value
{
    public int Hello {get;set;}
    public string Bye {get;set;}
}

电流输出:

QWERTY
QWERTY

我正在寻找的输出:

QWERTY
ASDF

编辑:

我现在设法让它工作,使用:

//dict[1] = new Value() { Hello = 2, Bye = "ASDF" };
dict[1].Hello = 2;
dict[1].Bye = "ASDF";

但是,有没有办法让我更新整个值而不是手动更新每个属性?

【问题讨论】:

  • 你给了dict[1]一个新的参考。 Value c 仍然引用了旧的 dict[1]
  • 嗯,你也在手动更新原始代码中的每个属性,那么有什么区别?
  • 你所做的很像Value v = XXX; Value c = v; /* copies reference, now two references to same instance */ v = YYY; /* assigns new reference to another instance to v; v and c no longer refer the same instance */。所以这也发生在变量上,并且与Dictionary&lt;,&gt; 没有真正的关系。两个变量不能以您想要的方式“链接”,因此对其中一个变量的赋值会“自动分配”给另一个变量。这种行为的唯一情况是带有ref(或out)修饰符的方法参数。

标签: c# .net dictionary reference-type


【解决方案1】:

它工作正常,问题是您使用的是对原始实例的引用 (c)。您的参考资料不会自动更新。

这表明它正在做你想做的事:

dict = new Dictionary<int,Value>();
Value v = new Value() { Hello = 1, Bye = "QWERTY"};
dict.Add(1, v);
Value c = dict[1];
Console.WriteLine(c.Bye);
dict[1] = new Value() { Hello = 2, Bye = "ASDF" };
Console.WriteLine(dict[1].Bye);//THIS LINE IS CHANGED

因此,澄清一下,您已经根据自己的要求更新了整个值。

只是一个建议,但它可能有助于您解释您想要达到的最终结果。可能有更好的方法来解决它。

【讨论】:

    【解决方案2】:
    c = dict[1] = new Value() { Hello = 2, Bye = "ASDF" };
    

    否则,你想要的对我来说没有意义。您已经告诉语言将 c 分配给其他东西。

    【讨论】:

      【解决方案3】:

      您确实从字典中获取值作为参考,但您应该知道字典中的存储也是参考,您只需为其分配另一个参考。

      【讨论】:

        猜你喜欢
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        • 2011-05-27
        • 2019-11-22
        相关资源
        最近更新 更多