C#通过引用传递参数

Joh*_*ohn 2 c# parameter-passing

我有下面的代码,它将字符串前缀到字符串数组的每个成员的开头.即.以"z"为前缀的["a","b","c"]变为["za","zb","zc"].

private string[] Prefix(string[] a, string b) {
   for(int i = 0;i < a.Length;i++) {
     a[i] = b + a[i];
   }
  return a;
}
Run Code Online (Sandbox Code Playgroud)

该功能工作正常(虽然如果有更好的方法来做到这一点,我很高兴听到它),但我在传递参数时遇到问题.

string[] s1 = new string[] {"a","b"};
string[] s2 = Prefix(s1,"z");
Run Code Online (Sandbox Code Playgroud)

现在据我所知,我正在通过值传递s1.但是,当前缀功能已经完成,S2和S1具有相同的值["ZA" ZB"],或S1已按引用传递.我确信你必须显式声明在C#这种行为,并且很迷茫.

Joe*_*orn 5

正如其他人所说,引用是按值传递的.这意味着您的s1引用被复制到a,但它们仍然引用内存中的同一对象.我要做的是修复你的代码是这样写的:

private IEnumerable<string> Prefix(IEnumerable<string> a, string b) {
   return a.Select(s => b + s);
}
Run Code Online (Sandbox Code Playgroud)

.

string[] s1 = new string[] {"a","b"};
string[] s2 = Prefix(s1,"z").ToArray();
Run Code Online (Sandbox Code Playgroud)

这不仅可以解决您的问题,而且还允许您使用Lists和其他字符串集合以及简单数组.