Какое использование свойства Tag в .net

Я заметил свойства Tag с элементами управления. Можно ли использовать это, чтобы ссылаться на мои пользовательские объекты, или я должен держаться подальше от него, поскольку это потребует бокса и распаковки, которые были упомянуты как небезопасные и не рекомендуется.

TreeNode tn = new TreeNode ();
CustClass o = new CustClass()
o.number = 123;
tn.Tag = o;

class CustClass
{
    public int number {get; set;}
}

Ответы

Ответ 1

Цель свойства Tag - использовать его для любых целей. Вы можете спокойно хранить все, что хотите.

Обычно объявляется класс, специально предназначенный для хранения в свойстве Tag (например, с вашим CustClass). Но если вам нужно только одно значение, тогда нет ничего плохого в сохранении в нем int.

Где вы узнали, что бокс/распаковка является "небезопасным"? Это абсолютно неверно. (Некоторые утверждают, что это неэффективно, но даже это неверно.) Кроме того, ваш код вообще не содержит пример бокса. CustClass является ссылочным типом. При присвоении object только значениям типа присваиваются значения.

Ответ 2

Я не думаю, что это проблема с боксом или распаковкой, чтобы использовать ее так, как вы хотите. Насколько я знаю, это свойство Tag предназначено только для целей программиста, поэтому вы можете использовать его так, как вам нужно, чтобы он использовался.

Подробнее о том, как использовать это свойство, см. в Control.Tag в MSDN.

Например, я использовал его для ввода инструкций пользователю в приложениях Windows Forms. Когда срабатывает событие управления GotFocus, инструкциям свойства Label.Text присваивается значение моего свойства тега управления, которое содержит строку инструкции.

Ответ 3

Из ссылок, упомянутых другими здесь:

в https://msdn.microsoft.com/en-us/library/system.windows.forms.control.tag.aspx  один читает:

Любой тип, полученный из класса Object, может быть назначен этому имущество. Если свойство Tag установлено через Windows Forms дизайнеру, может быть назначен только текст.

Общей целью использования свойства Tag является хранение данных, которые тесно связаны связанных с контролем. Например, если у вас есть элемент управления, который отображает информацию о клиенте, вы можете сохранить DataSet, который содержит историю заказов клиента в этом свойстве тега управления поэтому можно быстро получить доступ к данным.

и https://msdn.microsoft.com/en-us/library/system.windows.forms.treenode.tag.aspx читаем:

... example создает корневое дерево node для назначения узлов дочерних деревьев. дочернее дерево node для каждого объекта Customer в ArrayList добавляется к корневое дерево node, а также дочернее дерево node для каждого объекта Order назначенный объекту Customer. Объекту Customer присваивается значение свойство Tag и узлы дерева, представляющие объекты Customer, являются отображается оранжевым текстом. В этом примере требуется, чтобы Определенный объект Customer and Order, элемент управления TreeView на форме и ArrayList с именем customerArray, который содержит объекты Customer.