c#:Dictionary TryGetValue创建实例而不是获取引用
我对c#完全是个傻瓜,不明白为什么相同的方法会以不同的方式工作。我正在制作一个简单的电子表格应用程序,并使用单元格字典,其中键是字符串名称,值是单元格对象: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
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是单元格的内容),但这不就是从一开始就消除了对单元格结构的需要吗?有什么见解吗?