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
指向同一对象,因为它们是引用类型

您需要的是克隆控件。我想此链接将帮助您:

在克隆过程中,您实际上会将旧控件的所有道具复制到新控件。


准备了一个漂亮的扩展方法您可以用于所有控件,包括文本框

您所说的发布是什么意思?