使用只读结构作为字典键

时间:2019-03-27 10:26:18

标签: c# struct c#-7.2

我想知道当在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关键字标记它是否毫无意义?

0 个答案:

没有答案