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

C# 是否有可能通过修改数组元素的副本来修改它?,c#,arrays,C#,Arrays,我正在做一个相当复杂的项目,在过去的一个小时里一直在努力调试一个问题。我确定了一个麻烦的代码,大致如下所示: Client ClientToChange = Clients[index]; ClientToChange.Rank = 80; 客户端是在同一个类中声明的客户端类的静态数组 由于某种原因更改ClientToChange的排名会更改数组的内容,即 Console.WriteLine(Clients[index].Rank) 返回80(而在它之前是100),当然索引没有改变 我觉得这

我正在做一个相当复杂的项目,在过去的一个小时里一直在努力调试一个问题。我确定了一个麻烦的代码,大致如下所示:

Client ClientToChange = Clients[index];
ClientToChange.Rank = 80;
客户端是在同一个类中声明的客户端类的静态数组

由于某种原因更改ClientToChange的排名会更改数组的内容,即

Console.WriteLine(Clients[index].Rank)
返回80(而在它之前是100),当然
索引
没有改变

我觉得这很奇怪,但事实就是这样

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

    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#字符串是不可变的),那么在通过数组访问它时,您会看到变化。

与其说是修改副本,不如说是修改元素并通过对同一元素的第二次引用访问它。“字符串大小写不显示此行为的原因是,在这种情况下,您不是在修改包含的字符串,而是在更改名称以指向另一个对象。”-这种情况发生是因为字符串在C#中是不可变的,对吗?@szczurcio否,任何时候执行赋值(=)您正在更改该名称所指向的内容,而不是更改所指向的项。仅当您对该项本身执行操作时(更改属性或调用执行此操作的方法)这会导致变异,从而改变值。这并不是因为它是不可变的,而是因为它只能改变一个可变值,所以你看不到你以前使用可变值时的行为。好吧,我现在明白了。我真不敢相信我活了这么久却不了解这种行为。谢谢。