C# 对象引用的ArrayList
具有用户定义的类,如下所示:C# 对象引用的ArrayList,c#,pass-by-reference,C#,Pass By Reference,具有用户定义的类,如下所示: class Foo { public int dummy; public Foo(int dummy) { this.dummy = dummy; } } ArrayList dummyfoo = new ArrayList(); Foo a = new Foo(1); dummyfoo.add(a); foreach (Foo x in dummyfoo
class Foo
{
public int dummy;
public Foo(int dummy)
{
this.dummy = dummy;
}
}
ArrayList dummyfoo = new ArrayList();
Foo a = new Foo(1);
dummyfoo.add(a);
foreach (Foo x in dummyfoo)
x.dummy++;
然后是这样的:
class Foo
{
public int dummy;
public Foo(int dummy)
{
this.dummy = dummy;
}
}
ArrayList dummyfoo = new ArrayList();
Foo a = new Foo(1);
dummyfoo.add(a);
foreach (Foo x in dummyfoo)
x.dummy++;
假人多少钱
如何创建我的ArrayList,使a.dummy等于2,这意味着我的ArrayList基本上包含指向我的对象的指针,而不是副本。它已经包含引用,而不是副本。执行此操作时:
Foo a = new Foo(1);
dummyfoo.Add(a);
传递对a
的引用,而不是副本
因此,dummy
最初为1,增量后为2
无论如何,最好使用泛型:
List<Foo> dummyfoo = new List<Foo>();
Foo a = new Foo(1);
dummyfoo.Add(a);
foreach (Foo x in dummyfoo)
x.dummy++;
List dummyfoo=new List();
Foo a=新的Foo(1);
添加(a);
foreach(dummyfoo中的Foo x)
x、 虚拟++;
您将Foo
声明为类。课程是。它已经像这样工作了。试一试:
class Program
{
static void Main(string[] args)
{
ArrayList dummyfoo = new ArrayList();
Foo a = new Foo(1);
dummyfoo.Add(a);
foreach (Foo x in dummyfoo)
x.dummy++;
Console.WriteLine(a.dummy); //Prints 2!
}
}
class Foo
{
public int dummy;
public Foo(int dummy)
{
this.dummy = dummy;
}
}
另一方面,一般的
列表
比不推荐的数组列表
类型更受欢迎。它已经是2
:下面是验证
与值类型(即struct
s)不同,引用(即class
)对象是通过引用传递的
Consider var arr = new ArrayList();
上面的语句首先创建一个ArrayList对象,并将一个引用分配给arr(这与任何类类似,因为类是引用类型)
现在打电话的时候,
example -> DummyMethod(arr) ,
引用是按值传递的,即即使参数被分配给方法中的不同对象,原始变量也保持不变。但是,由于变量点(引用)指向同一对象,对底层定点对象执行的任何操作都会反映在被调用的方法之外。
在您的示例中,在中对每个进行的任何修改都将反映在arrayList中 如果要避免这种行为,必须创建对象的副本/克隆。 例如: 而不是
foreach (Foo x in dummyfoo)
x.dummy++;
使用
为什么不先运行它,看看a.dummy等于什么?使用属性访问器代替公共字段。而且最好使用通用列表结构。