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单独传递每个项目,我将如何执行此专长?
答案 0 :(得分:3)
您的代码根本无法达到预期效果。您的变量item1
和item2
将不会通过重新分配到列表进行修改。您无法将引用变量 添加到ArrayList
(或者最好是现代.NET世界中的List<T>
)。您只需添加值本身(可以是对象 的引用)。当您覆盖最初存储在列表中的值时,它不会影响上一个变量。
如果您需要列表中的更新来反映外部变量,您可能需要不同的抽象。例如,您将变量属性设置为,然后维护该类的列表。而不是覆盖列表的内容,然后您可以通过更改属性来改变类。这项技术在Niyoko Yuliawan's answer中得到了证明,因此我不会重新显示它。
Another technique mentioned是将值读回到变量中。如果列表具有相同顺序的相同数量的值,则这是可行的。但是,我应该注意,如果要向列表中添加多个值,将它们传递给方法,更改列表中的值,然后将这些值重新读入变量,您可能不需要列表,需要一个课程。例如,如果item1
和item2
firstName
和lastName
,则您不希望{ {1}}(或者,再次,最好是ArrayList list
),您真的希望List<string> list
具有Person person
和string 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];
顺便说一句,ArrayList
是List<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";
}