我想知道当在Dictionary中使用键时,只读结构的行为如何。我知道readonly和'in'的组合是为了防止不必要地制作大型结构的副本,并且以下描述的场景几乎不被视为'large'。但是我很好奇,我想保持代码简单。
例如
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关键字标记它是否毫无意义?