Использование структур readonly в качестве словарного ключа - PullRequest
0 голосов
/ 27 марта 2019

Мне было интересно, как ведут себя readonly-структуры при использовании ключа в словаре.Я знаю, что сочетание 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...