我是否正确认为以下代码段不起作用(数组项未被修改),因为数组是整数,它是值类型.
class Program { public static void Main() { int[] ints = new int[] { 1,2 }; Array.ForEach(ints, new Action(AddTen)); // ints is not modified } static void AddTen(int i) { i+=10; } }
如果示例使用字符串数组,则可能会应用相同的结果,大概是因为字符串是不可变的.
我的问题是: -
有没有解决的办法?我无法更改回调方法的签名 - 例如通过添加ref关键字,我不想用类包装值类型 - 这将工作...
(当然,我可以简单地编写一个老式的foreach循环来执行此操作!)
您只是更改局部变量 - 而不是列表中的项目.要执行此操作,您需要ConvertAll
创建新的列表/数组:
int[] ints = new int[] { 1,2 }; int[] newArr = Array.ConvertAll(ints, AddTen);
有:
static int AddTen(int i) { return i+10; }
这也可以用匿名方法编写:
int[] newArr = Array.ConvertAll(ints, delegate (int i) { return i+ 10;});
或者在C#3.0中作为lambda:
int[] newArr = Array.ConvertAll(ints, i=>i+10);
除此之外...一个for
循环:
for(int i = 0 ; i < arr.Length ; i++) { arr[i] = AddTen(arr[i]); // or more directly... }
但无论如何,你将不得不从你的方法中获得价值.除非你改变签名,否则你不能.