Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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# 这是电话咨询吗?_C#_Pass By Reference_Call By Value - Fatal编程技术网

C# 这是电话咨询吗?

C# 这是电话咨询吗?,c#,pass-by-reference,call-by-value,C#,Pass By Reference,Call By Value,我有一个ArrayList: ArrayList ReceivedPackets = new ArrayList(); ArrayList returnList = ReceivedPackets; 我还有一个ArrayList: ArrayList ReceivedPackets = new ArrayList(); ArrayList returnList = ReceivedPackets; 为什么运行此代码时returnList会丢失它的值 ArrayList ReceivedP

我有一个ArrayList:

ArrayList ReceivedPackets = new ArrayList();
ArrayList returnList = ReceivedPackets;
我还有一个ArrayList:

ArrayList ReceivedPackets = new ArrayList();
ArrayList returnList = ReceivedPackets;
为什么运行此代码时returnList会丢失它的值

ArrayList ReceivedPackets = new ArrayList();  // ReceivedPackets is empty
ReceivedPackets.Add(1);                       // Now it has an Integer
ArrayList returnList = ReceivedPackets;       // Call-by-Reference (I thought), returnList now has an Integer
ReceivedPackets.clear();                      // returnList is empty now. Why?
执行此操作时:

ArrayList returnList = ReceivedPackets;
您正在创建一个名为
returnList
的新变量,但该变量指向与
ReceivedPackets
相同的内存对象。仍然只有一个实际的
ArrayList
,它只有两个变量指向它。因此,对其中一个所做的更改反映在这两个方面


我怎样才能不让returnList失去它的价值呢

创建一个新对象。最简单的情况是这样的:

ArrayList returnList = new ArrayList();
如果您还希望该对象包含来自
ReceivedPackets
的所有值,幸运的是
ArrayList
有一个构造函数重载,它只执行以下操作:

ArrayList returnList = new ArrayList(ReceivedPackets);
现在有两个对象,它们应该包含相同数据的副本。对其中一项的更改不会反映在另一项中


在缺少该构造函数的情况下,
ArrayList
还具有一些
CopyTo()
方法,可用于将元素从一个复制到另一个。否则,您还可以手动循环源
ArrayList
并将元素复制到目标
ArrayList

如果
ArrayList
本身包含引用对象,这可能会变得非常混乱。因为它们也可能有多个指向同一内存对象的“指针”

例如,如果创建一个
小部件
对象并将其添加到两个
ArrayList
对象中,则对
ArrayList
对象所做的任何修改(添加/删除元素)都是独立的,但对
小部件
对象所做的任何修改都将反映在这两个
ArrayList
对象中

关键是
ArrayList
本身是一个对象,与它包含的对象无关

因此,根据您所做工作的全部内容,您的里程可能会有所不同。

当您这样做时:

ArrayList returnList = ReceivedPackets;
您正在创建一个名为
returnList
的新变量,但该变量指向与
ReceivedPackets
相同的内存对象。仍然只有一个实际的
ArrayList
,它只有两个变量指向它。因此,对其中一个所做的更改反映在这两个方面


我怎样才能不让returnList失去它的价值呢

创建一个新对象。最简单的情况是这样的:

ArrayList returnList = new ArrayList();
如果您还希望该对象包含来自
ReceivedPackets
的所有值,幸运的是
ArrayList
有一个构造函数重载,它只执行以下操作:

ArrayList returnList = new ArrayList(ReceivedPackets);
现在有两个对象,它们应该包含相同数据的副本。对其中一项的更改不会反映在另一项中


在缺少该构造函数的情况下,
ArrayList
还具有一些
CopyTo()
方法,可用于将元素从一个复制到另一个。否则,您还可以手动循环源
ArrayList
并将元素复制到目标
ArrayList

如果
ArrayList
本身包含引用对象,这可能会变得非常混乱。因为它们也可能有多个指向同一内存对象的“指针”

例如,如果创建一个
小部件
对象并将其添加到两个
ArrayList
对象中,则对
ArrayList
对象所做的任何修改(添加/删除元素)都是独立的,但对
小部件
对象所做的任何修改都将反映在这两个
ArrayList
对象中

关键是
ArrayList
本身是一个对象,与它包含的对象无关


因此,根据您所做工作的整个环境,您的里程可能会有所不同。

ArrayList
是一种引用类型,这意味着如果您只需将某个变量分配给它的实例,两个对象将指向内存中的同一位置

如果要创建深度复制,请创建一个新对象

static void Main() {
    ArrayList a = new ArrayList() {1,2,3};
    var b = a;
    var c = new ArrayList(a);

    a.Clear();
    Console.WriteLine(a.Count); // 0
    Console.WriteLine(b.Count); // 0
    Console.WriteLine(c.Count); // 3
}

ArrayList
是一种引用类型,这意味着如果您只需将某个变量分配给它的一个实例,两个对象都将指向内存中的同一位置

如果要创建深度复制,请创建一个新对象

static void Main() {
    ArrayList a = new ArrayList() {1,2,3};
    var b = a;
    var c = new ArrayList(a);

    a.Clear();
    Console.WriteLine(a.Count); // 0
    Console.WriteLine(b.Count); // 0
    Console.WriteLine(c.Count); // 3
}

ArrayList
是引用类型
ReceivedPackets
returnList
是指向内存中相同对象的两个引用变量。对该对象的修改将反映在两者中。如何才能不使returnList失去其值?
ArraList.Copy()
您必须使用的方法或
ArrayList returnList=new ArrayList(ReceivedPackages)旁注:“引用调用”通常意味着方法调用。。。您的帖子中没有。
ArrayList
是引用类型
ReceivedPackets
returnList
是指向内存中相同对象的两个引用变量。对该对象的修改将反映在两者中。如何才能不使returnList失去其值?
ArraList.Copy()
您必须使用的方法或
ArrayList returnList=new ArrayList(ReceivedPackages)旁注:“引用调用”通常意味着方法调用。。。你的职位上没有。