Один шаблон, который иногда полезен, - определить класс примерно так:
class Holder<T> {public T value;}
Такой класс позволяет передавать и изменять типы значений с помощью кода, который требует ссылочных типов.Используя такой подход, подпрограмма, которая принимает структуру по ссылке и должна была вызвать модальное диалоговое окно и заполнить структуру из него, может создать Holder<thatStructType>
, передать его в форму, а затем скопировать данные из этогоДержатель возвращается к переданной ссылке.Хотя в вашем конкретном сценарии может быть лучше, чтобы объект хранения данных был просто классом, структуры имеют преимущество в том, что можно знать, что не существует выдающихся ссылок на них;если подпрограмма объявляет структуру и передает ее по ссылке на некоторый внешний код, то после того, как этот код вернет значения в этой структуре, она не изменится до тех пор, пока подпрограмма не запишет их сама или не передаст структуру по ссылке на какой-то другой код.Напротив, если подпрограмма предоставляет ссылку на класс для внешнего кода, невозможно сказать, что этот код может с ней делать.
Кстати, класс Holder также полезен в ряде других сценариев.Например, если у вас есть Dictionary<String, Holder<Integer>> myDict
, можно использовать Threading.Interlocked.Increment(myDict(myKey).Value))
, чтобы выполнить потокобезопасное увеличение указанного элемента, гораздо более эффективно, чем было бы возможно с Dictionary<String, Integer>
.