C# 使用using语句时对象副本消失
当我运行文本框(C# 使用using语句时对象副本消失,c#,object,events,using,C#,Object,Events,Using,当我运行文本框(mytextbox)下面的代码时,我试图理解using语句是如何工作的 public partial class Form1 : Form { TextBox mytextbox = new TextBox(); public Form1() { InitializeComponent(); this.Controls.Add(mytextbox); mytextbox.Validated+=new Even
mytextbox
)下面的代码时,我试图理解using语句是如何工作的
public partial class Form1 : Form
{
TextBox mytextbox = new TextBox();
public Form1()
{
InitializeComponent();
this.Controls.Add(mytextbox);
mytextbox.Validated+=new EventHandler(mytextbox_Validated);
}
private void mytextbox_Validated(object sender, EventArgs etxtbox)
{
using (TextBox myeventtxtbox = ((TextBox)sender))
{
}
}
}
我认为using语句将在语句末尾释放myeventtxtbox
,但也不会释放mytxtbox
我在此代码中执行的操作:
我创建了一个对象mytxtbox
,它将保留在主窗体(Form1)上。
我还创建了一个事件,该事件将在已验证的mytxtbox
上引发。
在事件中,我使用using语句创建了一个TextBox
(myeventtxtbox
),它与mytextbox
(属性等)完全相同,但不是mytextbox
。
那么,为什么在退出使用语句时会释放mytextbox
?只有myeventtxtbox
(副本)才能发布
我真的错过了一些东西,你能帮我吗?它们是参考类型。因此,
myeventtxtbox
不会复制任何内容。mytextbox
和myeventtxtbox
都指向同一个对象,它们之间唯一的区别是引用的名称。基于:
引用类型由保存引用的引用使用
(地址)指向对象,但不是对象本身。因为参考
类型表示变量的地址而不是数据
本身,将引用变量分配给另一个变量不会复制
数据。相反,它会创建引用的第二个副本,该副本引用
与原始值相同的堆位置。参考类型
变量存储在另一个称为堆的内存区域中。
这意味着当引用类型变量不再使用时,它
可以标记为进行垃圾收集
以下帖子也可能很有趣:
我认为问题在于你假设:
TextBox myeventtxtbox = (TextBox)sender
正在复制您的文本框,因此您的内存中会有两个文本框。它没有,它只是创建了对同一文本框的另一个变量引用sender
也是表单上文本框的变量引用,using语句中的textbox
也是变量引用,因此有3个不同的变量都指向同一个文本框
重要的是要认识到,无论有多少不同的变量引用它,仍然只有一个文本框。如果你愿意打个比方,如果文本框是一台电视,建立另一个变量引用它就像买另一个遥控器。您现在有3个遥控器,其中任何一个都可以关闭电视。如果遥控器是显示电视状态的智能型设备,那么在任何一个遥控器关闭后,所有3个遥控器都会报告电视正在关闭(处置)。使用remote 1关闭电视后,无法使用remote 2打开音量
回到c#
最终,对文本框的任何变量引用调用.Dispose()
,将处理文本框本身,而不是对它的引用。使用语句的思想是,它处理在圆括号中设置的对象实例。对文本框的任何名称变量引用调用dispose(mytextbox、myeventtextbox、sender都是对它的引用)将处理文本框本身,因此当using语句结束并调用myeventtextbox.dispose()时,所有其他变量引用现在都与已处理的文本框相关联
我们不需要像在其他语言中那样在c语言中微观管理变量。当变量引用超出范围时(当执行离开大括号块时,变量在其中声明),变量引用将被清除。当不再存在对内存中对象的剩余引用时,该对象将从内存中删除
在这种情况下,当事件处理程序完成执行时,sender
和myeventextbox
将不再作为文本框的引用存在。文本框将仍然存在,因为mytextbox
仍然引用它。表单的.Controls
集合也引用它。如果将控件从中删除,那么控件
和mytextbox
设置为null,将不再存在对文本框的引用,并且将从内存中删除该控件要理解此问题,首先必须了解C中的对象(引用类型)是如何传递的
顾名思义,当您传递引用类型时,“复制”的唯一信息是它的引用(基本上是RAM中的内存地址)
因此,您的两个文本框变量都指向内存中的同一个对象
因此,当using语句结束时,GUI中的文本框被释放。此处mytextbox
和myeventtxtbox
指向同一对象,因为它们是引用类型
您需要的是克隆控件。我想此链接将帮助您:
在克隆过程中,您实际上会将旧控件的所有道具复制到新控件。
准备了一个漂亮的扩展方法您可以用于所有控件,包括文本框您所说的发布是什么意思?