Передать структуру в форму по ссылке и вернуть значение? - PullRequest
0 голосов
/ 03 декабря 2011

У меня есть структура:

struct Order
{
      public string orderNumber;
      public string orderDetail;
}

Затем я присваиваю некоторые значения в Form1 и пытаюсь передать их по ссылке (ref) в Form2:

(Form1)
Order order = new Order();
order.orderNumber = "1234";
order.orderDetail = "Widgets";
Form2 frm2 = new Form2(ref order);

Можно ли сохранить значения в Form2, чтобы, когда Form2 завершил обработку значений, он возвращал обновленные значения структуры в Form1?

В этом сценарии будет кнопка, которая закроет форму после проверки данных.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Один шаблон, который иногда полезен, - определить класс примерно так:

class Holder<T> {public T value;}

Такой класс позволяет передавать и изменять типы значений с помощью кода, который требует ссылочных типов.Используя такой подход, подпрограмма, которая принимает структуру по ссылке и должна была вызвать модальное диалоговое окно и заполнить структуру из него, может создать Holder&lt;thatStructType&gt;, передать его в форму, а затем скопировать данные из этогоДержатель возвращается к переданной ссылке.Хотя в вашем конкретном сценарии может быть лучше, чтобы объект хранения данных был просто классом, структуры имеют преимущество в том, что можно знать, что не существует выдающихся ссылок на них;если подпрограмма объявляет структуру и передает ее по ссылке на некоторый внешний код, то после того, как этот код вернет значения в этой структуре, она не изменится до тех пор, пока подпрограмма не запишет их сама или не передаст структуру по ссылке на какой-то другой код.Напротив, если подпрограмма предоставляет ссылку на класс для внешнего кода, невозможно сказать, что этот код может с ней делать.

Кстати, класс Holder также полезен в ряде других сценариев.Например, если у вас есть Dictionary<String, Holder<Integer>> myDict, можно использовать Threading.Interlocked.Increment(myDict(myKey).Value)), чтобы выполнить потокобезопасное увеличение указанного элемента, гораздо более эффективно, чем было бы возможно с Dictionary<String, Integer>.

2 голосов
/ 03 декабря 2011

Я думаю, вы спрашиваете, может ли Form2 хранить ссылку на структуру order, которая была передана в конструкторе. Ответ - нет. Если вы хотите хранить ссылки, используйте ссылочный тип (класс).

...