是否有可能做这样的事情:
string A = "A";
string B = "B";
object[] O = { A, B };
O[0] = "C";
A
最终价值在哪里"C"
?
上面的代码将替换O[0]
为"C"
,但A
保持不变。
不 - 至少不是在安全代码中。
创建数组时,它会将值复制到数组中。稍后更改数组中的值不会更改变量的值。没有办法创建一种“引用数组”,其中数组元素与变量共享。(如马克的回答所示,有时在不安全的代码中可以这样做,但我真的建议不要这样做。)
但是请注意,如果数组和变量都引用同一个可变对象,则通过任一路径更改该对象将产生可通过另一个路径看到的更改:
StringBuilder x = new StringBuilder();
StringBuilder[] array = new StringBuilder[] { x };
array[0].Append("Foo");
Console.WriteLine(x); // Prints "Foo"
不过,这与任何其他赋值没有什么不同 - 请注意,在上面的代码中,Append
调用不会更改x
数组元素或数组元素的值;它会更改这些值所引用的对象内的数据。
虽然在字符串的情况下答案是否定的,但您可以使用值类型执行此操作:
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# 中通常不受欢迎。所以,虽然这种事情是可能的,但我不建议这样做。
您可能想要的是将字符串转换为具有属性的对象。然后,您可以将数组对象投射到您创建的此对象类型的特定键上,然后您可以再次设置其属性。
通过这种方式,您可以将数组中的内容都更改为原始变量,因此,它类似于将其视为具有引用值的数组。
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