C#ArrayList.Add方法为项添加引用?

时间:2013-03-26 15:14:46

标签: c# arraylist pass-by-reference

0假设我创建了一个ArrayList并添加了两个字符串:

string item1 = string.Empty;
string item2 = string.Empty;

ArrayList someList = new ArrayList();
someList.Add(item1);
someList.Add(item2);

someFunc(someList);

然后我拿一些List并将其传递给一个方法。该方法对item1和item2执行一些操作并返回,如下所示:

public void someFunc(ArrayList parameters)
{
    parameters[0] = "Monkeys";
    parameters[1] = "More Monkeys";
}

我希望someFunc返回时item1等于“Monkeys”而item2等于“More Monkeys”,因为someList分别包含对索引0和1中的item1和item2的引用。但是,我看到的是item1等于“Monkeys”而item2等于“”。

为什么呢?如果不通过ref单独传递每个项目,我将如何执行此专长?

4 个答案:

答案 0 :(得分:3)

您的代码根本无法达到预期效果。您的变量item1item2将不会通过重新分配到列表进行修改。您无法将引用变量 添加到ArrayList(或者最好是现代.NET世界中的List<T>)。您只需添加值本身(可以是对象 引用)。当您覆盖最初存储在列表中的值时,它不会影响上一个变量。

如果您需要列表中的更新来反映外部变量,您可能需要不同的抽象。例如,您将变量属性设置为,然后维护该类的列表。而不是覆盖列表的内容,然后您可以通过更改属性来改变类。这项技术在Niyoko Yuliawan's answer中得到了证明,因此我不会重新显示它。

Another technique mentioned是将值读回到变量中。如果列表具有相同顺序的相同数量的值,则这是可行的。但是,我应该注意,如果要向列表中添加多个值,将它们传递给方法,更改列表中的值,然后将这些值重新读入变量,您可能不需要列表,需要一个课程。例如,如果item1item2 firstNamelastName,则您不希望{ {1}}(或者,再次,最好是ArrayList list),您真的希望List<string> list具有Person personstring FirstName属性。

所以,如果你有

string LastName

您可能应该考虑定义一个类,然后使用该类。

public void SomeFunc(ArrayList list)
{
     list[0] = "Sam";
     list[1] = "Smith";
}

答案 1 :(得分:2)

你做不到。但是,您可以这样做:

class Program
{
    class SomeClass
    {
        public string Content { get; set; }
    }

    static void Main(string[] args)
    {
        SomeClass a, b;
        a = new SomeClass { Content = "" };
        b = new SomeClass { Content = "" };
        ArrayList al = new ArrayList();
        al.Add(a);
        al.Add(b);

        SomeFunction(al);

        Console.WriteLine(a.Content);
        Console.WriteLine(b.Content);
        Console.ReadLine();
    }

    public static void SomeFunction(ArrayList param)
    {
        ((SomeClass)param[0]).Content = "aa";
        ((SomeClass)param[1]).Content = "bb";
    }
}

答案 2 :(得分:1)

要获得您想要的内容,您必须从ArrayList中读取值:

string item1 = string.Empty;
string item2 = string.Empty;

ArrayList someList = new ArrayList();
someList.Add(item1);
someList.Add(item2);

someFunc(someList);

item1 = (string)someList[0];
item2 = (string)someList[1];

顺便说一句,ArrayListList<T>的更好选择,在这种情况下,List<string>。{/ p>

答案 3 :(得分:1)

如果不从数组中读取它们,你就无法做到这一点,这是一个LinqPad示例,向您展示输出。正如您所看到的,数组的值已经改变,但您的原始变量没有。

    void Main()
{
string item1 = "test1";
string item2 = "test2";

ArrayList someList = new ArrayList();
someList.Add(item1);
someList.Add(item2);

item1.Dump();
item2.Dump();

someFunc(someList);

item1.Dump();
item2.Dump();

someList.Dump();
}

public void someFunc(ArrayList parameters)
{
    parameters[0] = "Monkeys";
    parameters[1] = "More Monkeys";
}

使用“true”引用类型包装器

public class StringWrapper
{
    public string value;
}

void Main()
{
StringWrapper item1 = new StringWrapper() {value = "test1" };
StringWrapper item2 = new StringWrapper() {value = "test2" };

List<StringWrapper> someList = new List<StringWrapper>();
someList.Add(item1);
someList.Add(item2);

item1.Dump();
item2.Dump();

someFunc(someList);

item1.Dump();
item2.Dump();

someList.Dump();
}

public void someFunc(List<StringWrapper> parameters)
{
    parameters[0].value = "Monkeys";
    parameters[1].value = "More Monkeys";
}