Какой смысл использовать свойство Tag в .net? - PullRequest
16 голосов
/ 29 сентября 2010

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

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

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

Ответы [ 4 ]

34 голосов
/ 29 сентября 2010

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

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

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

4 голосов
/ 29 сентября 2010

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

См. Свойство Control.Tag на MSDN для получения дополнительной информации о том, как использовать это свойство.

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

3 голосов
/ 23 августа 2015

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

при https://msdn.microsoft.com/en-us/library/system.windows.forms.control.tag.aspx каждый читает:

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

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

и на https://msdn.microsoft.com/en-us/library/system.windows.forms.treenode.tag.aspx каждый читает:

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

1 голос
/ 29 сентября 2010

Хорошо, вы можете создать свой собственный производный класс TreeNode:

class MyNode : TreeNode {
    public int number {get; set;}
}

Но тогда вы будете выполнять приведение, когда извлекаете узел из дерева, без улучшения по сравнению с приведением свойства TagИ вам следует переопределить метод Clone ().

Более чистый подход - использовать TreeNode.Name и сделать это ключом в словаре для поиска ваших пользовательских данных.Хорошо, когда CustClass становится нетривиальным.Свойство Name больше ни для чего не используется.

...