是否有可能通过修改其副本来更改数组元素?

use*_*520 2 c# arrays

我正在开展一个相当复杂的项目,并且在过去一小时内一直在努力调试一个问题.我找到了看起来或多或少像这样的麻烦代码:

Client ClientToChange = Clients[index];
ClientToChange.Rank = 80;
Run Code Online (Sandbox Code Playgroud)

客户端是Client类的静态数组,在同一个类中声明.

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

Console.WriteLine(Clients[index].Rank)
Run Code Online (Sandbox Code Playgroud)

返回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);
Run Code Online (Sandbox Code Playgroud)

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

我在做一些我看不到的事情,或者我不知道应该做些什么?

Gar*_*tty 5

当你完成任务

Client ClientToChange = Clients[index];
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @szczurcio不,任何时候你做一个赋值(=)你正在改变那个名字指向的东西,而不是改变被指向的项目.只有当您对该项目本身执行操作(更改属性或调用这样做的方法)才会导致变异,从而更改该值.所以这不是因为它是不可变的,而是只能改变一个可变的值,所以你不能看到你之前使用可变值的行为. (2认同)