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
)对象是通过引用传递的


列表>代码>代替<代码> ARAYLIST/<代码>以改进类型安全性。

< P>已为2,默认情况下,通过引用传递数组/集合(精确的任何.Net类/引用类型)。p> 事实上,引用变量是通过值传递的,但其行为就像通过引用传递一样

为什么->

  Consider var arr = new ArrayList();
上面的语句首先创建一个ArrayList对象,并将一个引用分配给arr(这与任何类类似,因为类是引用类型)

现在打电话的时候,

example ->    DummyMethod(arr) , 
引用是按值传递的,即即使参数被分配给方法中的不同对象,原始变量也保持不变。
但是,由于变量点(引用)指向同一对象,对底层定点对象执行的任何操作都会反映在被调用的方法之外。
在您的示例中,在中对每个进行的任何修改都将反映在arrayList中

如果要避免这种行为,必须创建对象的副本/克隆。

例如:

而不是

foreach (Foo x in dummyfoo)
        x.dummy++;
使用


为什么不先运行它,看看a.dummy等于什么?使用属性访问器代替公共字段。而且最好使用通用列表结构。