首页 > 解决方案 > 使用只读结构作为字典键

问题描述

我想知道在字典中使用键时只读结构的行为如何。我知道 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 关键字标记它是否毫无意义?

标签: c#structc#-7.2

解决方案


推荐阅读