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

c#:Dictionary TryGetValue创建实例而不是获取引用,c#,dictionary,reference,out,trygetvalue,C#,Dictionary,Reference,Out,Trygetvalue,我对c#完全是个傻瓜,不明白为什么相同的方法会以不同的方式工作。我正在制作一个简单的电子表格应用程序,并使用单元格字典,其中键是字符串名称,值是单元格对象: public struct Cell { private string Name { get; } public Object Content { get; set; } public Cell(string n, Object o) { Name = n; Content

我对c#完全是个傻瓜,不明白为什么相同的方法会以不同的方式工作。我正在制作一个简单的电子表格应用程序,并使用单元格字典,其中键是字符串名称,值是单元格对象:

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();
字典单元格=新建字典();
//将新单元格分配到5.0并打印
单元格。添加(“a1”,新单元格(“a1”,5.0));
Console.WriteLine(单元格[“a1”].Content);//写5
//将单元格分配给新内容并打印
单元格。TryGetValue(“a1”,单元格外值);
含量=10.0;
Console.WriteLine(单元格[“a1”].Content);//写5
Console.ReadKey();
当然,字典很好地创建了新的单元格,但是当我使用TryGetValue时,单元格的新内容与我试图获取的实际对象不符。我以为第二次打印是10。在debug中,它似乎实例化了一个新的单元格,而不是获取当前单元格的引用


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

单元格
是一个
结构。不建议对可修改的对象使用
struct
。我想你刚刚发现了原因

TryGetValue
返回
struct
时,它将其复制到一个
值中,该值与
字典中的
结构不同

想象一下,如果您将
struct
替换为
int
——另一种值类型——您是否希望从
TryGetValue
中为
int
赋值以更改
字典
条目
int

如果其他约束要求您使用
结构
,则需要使用新的
结构
更新
单元格
字典
,就像您使用任何其他值类型一样:

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;
cells["a1"] = value;  // update cells Dictionary
Console.WriteLine(cells["a1"].Content);     //  Writes 5
Console.ReadKey();
字典单元格=新建字典();
//将新单元格分配到5.0并打印
单元格。添加(“a1”,新单元格(“a1”,5.0));
Console.WriteLine(单元格[“a1”].Content);//写5
//将单元格分配给新内容并打印
单元格。TryGetValue(“a1”,单元格外值);
含量=10.0;
单元格[“a1”]=值;//更新单元格字典
Console.WriteLine(单元格[“a1”].Content);//写5
Console.ReadKey();

您需要将
结构单元
变成
类单元

这是因为
struct
是一种值类型,其内容不能通过引用更改。
如果您想详细了解,可以阅读有关值和引用类型的差异

您将单元格定义为结构。是值类型。因此,您将检索一个副本而不是referencePerfect,当我将“struct”替换为“class”时,它满足了我的期望。我想这里真正的问题是,根据我教授的说明,细胞是一个结构。我想我可以将字典更改为(其中Object是单元格的内容),但这不就是从一开始就消除了对单元格结构的需要吗?有什么见解吗?