是否有可能通过修改数组元素的副本来改变它

本文关键字:副本 本来 改变 数组元素 有可能 修改 是否 | 更新日期: 2023-09-27 18:02:45

我正在做一个相当复杂的项目,并且在过去的一个小时里一直在努力调试一个问题。我确定了这段麻烦的代码,它看起来差不多是这样的:

Client ClientToChange = Clients[index];
ClientToChange.Rank = 80;

Clients是Client类的静态数组,在同一个类中声明。

由于某种原因改变ClientToChange的秩会改变数组的内容,即

Console.WriteLine(Clients[index].Rank)

返回80(而之前是100),当然index没有改变。

这对我来说似乎很奇怪,但事实就是这样。

我写了一个小的虚拟程序来测试一下,只是为了确保:

    static string[] foo = new string[10];
    static void Main(string[] args)
    {
        foo[3] = "bar";
        string test = "";
        test = foo[3];
        test = "fb";
        Console.Write(foo[3]);
        Console.Write(test);

这个,当然,像它应该的那样工作:打印barfb.

我做了什么我看不见的事情,或者我不知道我应该知道的事情?

是否有可能通过修改数组元素的副本来改变它

当你做分配时

Client ClientToChange = Clients[index];

您使ClientToChange成为对Clients[index]的对象的引用,而不是复制它。它们都是碰巧指向同一个对象的名称。这是有意义的,当您更改它时,您可以看到这些更改,无论您使用哪个名称(数组中的引用只是特定类型的名称)。

如果你想要一个不同的对象,你应该复制它。

您的字符串大小写没有显示此行为的原因是因为在这种情况下,您没有修改包含的字符串,而是更改名称以指向另一个对象。改变一个名字所指向的并不会改变其他名字所指向的。如果你想改变字符串(你不能这样做,因为c#字符串是不可变的),那么你将在通过数组访问它时看到变化。