c# - 使用只读结构作为字典键
问题描述
我想知道在字典中使用键时只读结构的行为如何。我知道 readonly 和 'in' 的组合是为了防止不必要地复制大型结构,并且下面描述的场景几乎不被认为是“大”。但是我很好奇,我想保持代码简单。
例如
public readonly struct MyStruct
{
public int Value1 { get; }
public int Value2 { get; }
public MyStruct(int val1, int val2)
{
Value1 = val1;
Value2 = val2;
}
//also overries GetHashCode and Equals
}
现在,如果我要创建一个采用这些结构之一并使用它的数据的方法,因为它被标记为只读,我可以将该参数标记为“in”参数
public int MyMethod(in MyStruct mystruct)
{
//do stuff
return 0;
}
据我了解,这样做会阻止结构创建保护性副本,以确保它不会在方法内部被修改。
到目前为止一切顺利,我希望。
现在到问题的实质。
当我使用只读结构作为字典中的键时会发生什么?
public Dictionary<MyStruct, string> MyDict;
做的时候
var myStruct = new MyStruct(1,2);
mydict.Add(myStruct,"value");
是否制作了我的只读结构的副本?由于方法签名不使用'in'作为关键参数。
同样在尝试做一些事情时TryGetValue
myDict.TryGetValue(myStruct, out var myString);
这会再次复制 myStruct 吗?
最后,如何使用索引查找字典?
var myVal = myDict[myStruct]
如果制作了副本并且我的结构的主要用例将用作键,那么用 readonly 关键字标记它是否毫无意义?
解决方案
推荐阅读
- javascript - 如何在不重新创建 React 中的整个列表的情况下更新项目
- node.js - 如何使用 https.request 执行获取请求?
- typescript - 如何合并两个接口类型与合并的重叠属性类型?
- java - Java switch case 中断方法
- javascript - 在 Eclipse JEE 中启用 javascript 内容辅助
- symfony - 为什么 codecoverage 要我覆盖定义变量?
- python - 使用 Tkinter 按钮控制 IP 摄像机 (Python)
- azure-hdinsight - Namenode 正常运行时间指标 Ambari 服务器
- python - Urwid:具有不同外观的按钮的选项
- kubernetes - 自动缩放 Pod 时,kubernetes 是否会在新机器上运行新的虚拟机?