C# 为什么我分配给变量的值消失了?

C# 为什么我分配给变量的值消失了?,c#,winforms,variables,C#,Winforms,Variables,我将avariableA的值分配给另一种形式variableB。为什么在我清除变量a之后两个变量都是空的 Before execute entries.clear() 两个frm5。条目和条目都指同一个对象,因为前面的代码: frm5.entries = entries; 这里每个变量的值只是对一个对象的引用,就像两张纸上有相同的住址一样。调用entries.Clear()就像说“带着写在entries纸上的地址去那所房子,把所有的家具都搬走。”如果你带着写在frm5.entries纸上的

我将a
variableA
的值分配给另一种形式
variableB
。为什么在我清除
变量a
之后两个变量都是空的

Before execute entries.clear()


两个
frm5。条目
条目
都指同一个对象,因为前面的代码:

frm5.entries = entries;
这里每个变量的值只是对一个对象的引用,就像两张纸上有相同的住址一样。调用
entries.Clear()
就像说“带着写在
entries
纸上的地址去那所房子,把所有的家具都搬走。”如果你带着写在
frm5.entries纸上的地址去那所房子,你会看到一个空房子

这就是引用类型在.NET中的工作方式,理解这一点对于在任何.NET语言中取得进展都是至关重要的。我有一本书,里面有更多的信息,还有一本你可能会觉得有用的书

下面是一个示例,演示了这一点:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        List<string> x = new List<string>();
        List<string> y = x;
        // x and y now refer to the same list...

        x.Add("foo");
        Console.WriteLine(y.Count); // 1

        y.Clear();
        Console.WriteLine(x.Count); // 0

        // Changing x or y to refer to a different list
        // *doesn't* change the other variable
        x = new List<string>();
        x.Add("bar");
        x.Add("baz");

        Console.WriteLine(y.Count); // 0
    }
}
使用系统;
使用System.Collections.Generic;
课堂测试
{
静态void Main()
{
列表x=新列表();
列表y=x;
//x和y现在指的是同一个列表。。。
x、 添加(“foo”);
Console.WriteLine(y.Count);//1
y、 清除();
Console.WriteLine(x.Count);//0
//更改x或y以引用其他列表
//*不*更改其他变量
x=新列表();
x、 添加(“酒吧”);
x、 添加(“baz”);
Console.WriteLine(y.Count);//0
}
}

试试frm5.entries=entries.ToArray();那会复制你的收藏。我想现在你复制的是参考而不是价值。在一个变量上运行Clear()会导致另一个变量也将为空,因为它指向内存中的同一个空间。

似乎
条目是集合、数组或
列表或其他一些

无论如何,所有这些都称为类,您可以创建这些类的实例。然后,这些对象是引用类型,这意味着变量只包含对内存的引用,对象在内存中被“记住”。因此,当您将变量分配给另一个变量时,该另一个变量也仅包含对同一内存的引用

因此,当您更改一个变量时,底层对象会发生更改,因此第二个变量也会受到影响(使用一个变量所做的所有更改都会反映在持有相同引用的所有变量中)


我建议你读一读,以便更好地理解。例如:

我不确定条目的数据类型,但如果entries变量是DataTable,请开始使用like:

在if块中

frm5.entries = entries.Copy();
frm5.entries1 = entries.Copy();
在else块中

frm5.entries = entries.Copy();
frm5.entries1 = entries.Copy();

它将解决您的问题。

欢迎使用堆栈溢出。我强烈怀疑这两个变量指向同一个对象。如果看不到更多的代码,很难说得更多。请提供问题中的代码,而不是截图。谢谢回答。我的
条目
是一个列表,所以我使用了
.ToList()
,但是对于
数据表
呢?哦…对于
数据表
来说是
.Copy()
,非常感谢。这个关于“对象引用”的漂亮解释就是为什么你是第一个这样做的人!