在VB.NET中,contextstrip.tag = dgv是否作为指针或副本?

时间:2014-02-26 13:23:33

标签: .net vb.net pointers memory

在VB.NET中

Dim dgv as new datagridview
contextstrip.tag = dgv 

充当指针还是副本?

由于.SourceControl存在问题,我正在使用它将控制DGV传递给Context Menus dropdownitems。这有多低效?

1 个答案:

答案 0 :(得分:2)

它用作指针,而不是副本。你可以告诉我的方式是对象的类型。在其他语言(如C)中,您可以以任一方式引用任何对象,因为它由您定义变量的方式决定。但是,在.NET中,它由对象本身的类型决定。 .NET的设计者决定,为了简单起见,如果你想引用某些东西作为指针,你可能总是希望将它作为指针引用,反之亦然。

Reference Types(类)是始终在堆上创建并由指针引用的对象。值类型(结构)总是在堆栈上创建,变量直接包含数据,而不是指向数据的指针。由于DataGridView被声明为Class,因此它是引用类型。因此,设置为DataGridView对象的任何变量都将包含指针,而不是副本。如果你真的需要复制,你需要研究克隆或序列化。

另外,值类型对象也可以通过名为Boxing的进程放在堆上。由于Tag属性声明为Object,如果要将其设置为值类型对象,则首先将对象加框。