这是按引用调用吗?
Is this call-by-reference?
我有一个 ArrayList:
ArrayList ReceivedPackets = new ArrayList();
我还有另一个 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
,它只是有两个指向它的变量。因此,对一个所做的更改会反映在两者中。
How can I do without returnList loosing it's value?
创建一个新对象。在最简单的情况下,它看起来像这样:
ArrayList returnList = new ArrayList();
如果您还希望该对象包含来自 ReceivedPackets
的所有值,幸运的是 ArrayList
有一个构造函数重载可以做到这一点:
ArrayList returnList = new ArrayList(ReceivedPackets);
现在你有两个对象,它们应该包含相同数据的副本。对一个的更改不会反映在另一个中。
在没有该构造函数的情况下,ArrayList
也有一些 CopyTo()
方法可用于将元素从一个复制到另一个。如果做不到这一点,您还可以手动遍历源 ArrayList
并将元素复制到目标 ArrayList
.
可能 如果 ArrayList
本身 包含 引用对象,这会变得非常混乱。因为那些也可能对同一个内存对象有多个 "pointers"。
例如,如果您创建单个 Widget
对象并将其添加到两个 ArrayList
对象,那么对 ArrayList
对象(adding/removing 元素)所做的任何修改) 将是独立的,但对 Widget
对象所做的任何修改都会反映在两个 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:
ArrayList ReceivedPackets = new ArrayList();
我还有另一个 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
,它只是有两个指向它的变量。因此,对一个所做的更改会反映在两者中。
How can I do without returnList loosing it's value?
创建一个新对象。在最简单的情况下,它看起来像这样:
ArrayList returnList = new ArrayList();
如果您还希望该对象包含来自 ReceivedPackets
的所有值,幸运的是 ArrayList
有一个构造函数重载可以做到这一点:
ArrayList returnList = new ArrayList(ReceivedPackets);
现在你有两个对象,它们应该包含相同数据的副本。对一个的更改不会反映在另一个中。
在没有该构造函数的情况下,ArrayList
也有一些 CopyTo()
方法可用于将元素从一个复制到另一个。如果做不到这一点,您还可以手动遍历源 ArrayList
并将元素复制到目标 ArrayList
.
可能 如果 ArrayList
本身 包含 引用对象,这会变得非常混乱。因为那些也可能对同一个内存对象有多个 "pointers"。
例如,如果您创建单个 Widget
对象并将其添加到两个 ArrayList
对象,那么对 ArrayList
对象(adding/removing 元素)所做的任何修改) 将是独立的,但对 Widget
对象所做的任何修改都会反映在两个 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
}