我想知道在字典中使用键时只读结构的行为。我知道只读和“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");
我的readonly struct有副本吗?因为方法签名不使用“in”作为密钥参数。
在尝试做一些事情时,比如
TryGetValue
myDict.TryGetValue(myStruct, out var myString);
这会再次复制我的结构吗?
最后,用索引查字典怎么样?
var myVal = myDict[myStruct]
如果制作了副本,并且my struct的主要用例将用作键,那么用readonly关键字标记它是否毫无意义?