Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标记属性在.net中有什么用途_C#_.net_Winforms_.net 2.0 - Fatal编程技术网

C# 标记属性在.net中有什么用途

C# 标记属性在.net中有什么用途,c#,.net,winforms,.net-2.0,C#,.net,Winforms,.net 2.0,我注意到带有控件的标记属性。使用它来引用我的自定义对象可以吗?或者我应该远离它,因为它需要装箱和拆箱,这被认为是不安全的,不推荐使用 TreeNode tn = new TreeNode (); CustClass o = new CustClass() o.number = 123; tn.Tag = o; class CustClass { public int number {get; set;} } 标记属性的用途是让您可以将其用于任何目的。你可以在那里安全地储存任何你想要的

我注意到带有控件的标记属性。使用它来引用我的自定义对象可以吗?或者我应该远离它,因为它需要装箱和拆箱,这被认为是不安全的,不推荐使用

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

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

标记
属性的用途是让您可以将其用于任何目的。你可以在那里安全地储存任何你想要的东西

通常会声明一个专门用于存储在
标记
属性中的类(就像您对
CustClass
所做的那样)。但是,如果只需要一个值,那么直接在其中存储
int
并没有什么错


你在哪里读到装箱/拆箱是“不安全的”?这绝对不是事实。(有些人声称这是低效的,但即使这样也不是真的。)此外,您的代码甚至根本不包含装箱示例
CustClass
是一种参考类型。当分配给
对象时,只有值类型才被装箱

我认为以您想要的方式使用它不会是装箱或拆箱问题。据我所知,Tag属性仅用于程序员的目的,因此您可以按照需要的方式使用它

有关如何使用此属性的进一步参考,请参阅MSDN上的属性


例如,我曾经使用它在Windows窗体应用程序中向用户输入指令。触发控件GotFocus事件时,指令标签.Text属性被分配包含指令字符串的my control Tag属性的值。

您可以创建自己的TreeNode派生类:

class MyNode : TreeNode {
    public int number {get; set;}
}
但是,当您从树中检索节点时,您将进行强制转换,与强制转换Tag属性相比没有任何改进。您应该重写Clone()方法


一种更简洁的方法是利用TreeNode.Name,并将其作为字典中的一个键来查找您的自定义数据。当CustClass变得不平凡时,这很好。Name属性不用于任何其他内容。

来自其他人在此处提到的链接:

在 其中一条是:

从对象类派生的任何类型都可以指定给此对象 财产。如果标签属性是通过Windows窗体设置的 设计器,只能指定文本

Tag属性的一个常见用途是存储密切相关的数据 与控件关联。例如,如果您有一个控件 显示有关客户的信息,您可以存储以下数据集: 在该控件的标记属性中包含客户的订单历史记录 因此,可以快速访问数据

其中一条写道:

…示例创建根树节点以将子树节点分配给。A. ArrayList中每个客户对象的子树节点都添加到 每个订单对象的根树节点以及子树节点 分配给客户对象。客户对象已分配给 标记属性和表示客户对象的树节点是 以橙色文本显示。此示例要求您具有 定义了Customer和Order对象,窗体上的TreeView控件,以及 包含客户对象的名为customerArray的ArrayList


一个很好的起点:当大量使用时,取消装箱是低效的,但是对于控件中的一个int,它不太可能被注意到。