1

是否有可能做这样的事情:

string A = "A";
string B = "B";

object[] O = { A, B };
O[0] = "C";

A最终价值在哪里"C"

上面的代码将替换O[0]"C",但A保持不变。

4

3 回答 3

12

不 - 至少不是在安全代码中。

创建数组时,它会将复制到数组中。稍后更改数组中的值不会更改变量的值。没有办法创建一种“引用数组”,其中数组元素与变量共享。(如马克的回答所示,有时在不安全的代码中可以这样做,但我真的建议不要这样做。)

但是请注意,如果数组和变量都引用同一个可变对象,则通过任一路径更改该对象将产生可通过另一个路径看到的更改:

StringBuilder x = new StringBuilder();
StringBuilder[] array = new StringBuilder[] { x };

array[0].Append("Foo");
Console.WriteLine(x); // Prints "Foo"

不过,这与任何其他赋值没有什么不同 - 请注意,在上面的代码中,Append调用不会更改x数组元素或数组元素的值;它会更改这些值所引用的对象内的数据。

于 2012-11-06T17:47:42.720 回答
1

虽然在字符串的情况下答案是否定的,但您可以使用值类型执行此操作:

class Program
{
  static unsafe void Main()
  {
    char A = 'A';
    char B = 'B';

    var O = new char*[] { &A, &B };

    *O[0] = 'C';

    System.Console.WriteLine(A + "," + B); // outputs C,B            
  }
}

不安全的代码在 C# 中通常不受欢迎。所以,虽然这种事情是可能的,但我不建议这样做。

于 2012-11-06T19:32:05.567 回答
0

您可能想要的是将字符串转换为具有属性的对象。然后,您可以将数组对象投射到您创建的此对象类型的特定键上,然后您可以再次设置其属性。

通过这种方式,您可以将数组中的内容都更改为原始变量,因此,它类似于将其视为具有引用值的数组。

public class stringObject
{
  private string name;
  public string Name { get { return name; } set { name = value; } }
}
stringObject A = new stringObject();
A.Name = "A";
stringObject B = new stringObject();
B.Name = "B";

object[] O = { A, B };

//change the array at key 0, and also changing our original variable
stringObject C = O[0] as stringObject;
C.Name = "C";

上面的代码不仅会改变 O[0] 中的内容,还会更新对象 A 中的内容。

可以在这里看到一个测试写入控制台的示例: https ://dotnetfiddle.net/Yt25hy

于 2020-01-02T14:39:09.120 回答