c#:Dictionary TryGetValue创建实例而不是获取引用

时间:2018-02-16 20:07:48

标签: c# dictionary reference out trygetvalue

我是c#的总菜鸟,无法弄清楚为什么同一种方法以不同的方式运作。我正在制作一个简单的电子表格应用程序,并使用单元格词典,其中键是字符串名称,值是Cell对象:

public struct Cell
{
    private string Name { get; }
    public Object Content { get; set; }

    public Cell(string n, Object o)
    {
        Name = n;
        Content = o;
    }
}

现在,我需要能够轻松添加/更改单元格的内容,所以我一直在这样做:

Dictionary<string, Cell> cells = new Dictionary<string, Cell>();

//  Assign new cell to 5.0 & print
cells.Add("a1", new Cell("a1", 5.0));
Console.WriteLine(cells["a1"].Content);     //  Writes 5

//  Assign cell to new content & print
cells.TryGetValue("a1", out Cell value);
value.Content = 10.0;
Console.WriteLine(cells["a1"].Content);     //  Writes 5
Console.ReadKey();

当然,字典创建新单元格就好了,但是当我使用TryGetValue时,单元格的新内容并没有使它成为实际的对象我是想要得到。我期待第二次打印是10.在调试中,它似乎实例化一个新的Cell而不是获取手头的单元格的引用。

之前我使用过Dictionary,并且我使用了TryGetValue来更改现有对象的属性。所以这里有两个问题:在这种情况下我做错了什么,以及哪些因素决定了方法是否返回引用?

2 个答案:

答案 0 :(得分:2)

Cellstruct。不建议您对可以修改的对象使用struct。我想你刚才发现了原因。

TryGetValue返回struct时,它会将其复制到value,与struct中的Dictionary不同{。}}。

想象一下,如果您将struct替换为int - 另一种值类型 - 您希望从int分配TryGetValue来更改Dictionary条目{ {1}}?

如果其他约束要求您使用int,则需要使用新的struct更新cells Dictionary,就像使用任何其他值类型一样:

struct

答案 1 :(得分:1)

您需要将struct Cell变为class Cell

那是因为struct是一个值类型,它的内容不能通过引用来更改。 如果您想详细了解,可以阅读有关价值差异和参考类型here的信息。