代码之家  ›  专栏  ›  技术社区  ›  Dave

使用只读结构作为字典键

  •  0
  • Dave  · 技术社区  · 5 年前

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

    0 回复  |  直到 5 年前
    推荐文章