Мне было интересно, как ведут себя 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?