c#: Dictionary TryGetValue 创建实例而不是获取引用
c#: Dictionary TryGetValue creating instance instead of getting reference
我完全是个 C# 菜鸟,无法弄清楚为什么相同的方法以不同的方式工作。我正在制作一个简单的电子表格应用程序,并使用单元格字典,其中键是字符串名称,值是 Cell 对象:
public struct Cell
{
private string Name { get; }
public Object Content { get; set; }
public Cell(string n, Object o)
{
Name = n;
Content = o;
}
}
现在,我需要能够轻松 add/change 单元格的内容,所以我一直在这样做:
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。在调试中,它似乎实例化了一个新的单元格,而不是获取手头单元格的引用。
我以前使用过字典,并且使用过 TryGetValue 来更改现有对象的属性。所以这里有两个问题:在这种情况下我做错了什么,什么因素决定了方法 returns 是否是参考?
Cell
是一个 struct
。不建议您对可修改的对象使用 struct
。我想你刚刚发现了原因。
当 TryGetValue
returns struct
时,它会将其复制到 value
中,这与 [=] 中的不同 struct
18=].
想象一下,如果您将 struct
替换为 int
(另一种值类型),您会期望从 TryGetValue
分配给 int
以更改 Dictionary
条目 int
?
如果其他约束要求您使用 struct
,您将需要使用新的 struct
更新 cells
Dictionary
,就像您使用任何其他约束一样值类型:
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();
您需要将 struct Cell
变成 class Cell
。
那是因为struct
是一个值类型,它的内容不能通过引用来改变。
如果您想详细了解,可以阅读有关值和引用类型的差异 here。
我完全是个 C# 菜鸟,无法弄清楚为什么相同的方法以不同的方式工作。我正在制作一个简单的电子表格应用程序,并使用单元格字典,其中键是字符串名称,值是 Cell 对象:
public struct Cell
{
private string Name { get; }
public Object Content { get; set; }
public Cell(string n, Object o)
{
Name = n;
Content = o;
}
}
现在,我需要能够轻松 add/change 单元格的内容,所以我一直在这样做:
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。在调试中,它似乎实例化了一个新的单元格,而不是获取手头单元格的引用。
我以前使用过字典,并且使用过 TryGetValue 来更改现有对象的属性。所以这里有两个问题:在这种情况下我做错了什么,什么因素决定了方法 returns 是否是参考?
Cell
是一个 struct
。不建议您对可修改的对象使用 struct
。我想你刚刚发现了原因。
当 TryGetValue
returns struct
时,它会将其复制到 value
中,这与 [=] 中的不同 struct
18=].
想象一下,如果您将 struct
替换为 int
(另一种值类型),您会期望从 TryGetValue
分配给 int
以更改 Dictionary
条目 int
?
如果其他约束要求您使用 struct
,您将需要使用新的 struct
更新 cells
Dictionary
,就像您使用任何其他约束一样值类型:
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();
您需要将 struct Cell
变成 class Cell
。
那是因为struct
是一个值类型,它的内容不能通过引用来改变。
如果您想详细了解,可以阅读有关值和引用类型的差异 here。