我正在开展一个相当复杂的项目,并且在过去一小时内一直在努力调试一个问题。我找到了看起来或多或少的麻烦代码:
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。
我做的是我看不到的东西,或者我不知道应该做些什么?
答案 0 :(得分:5)
执行作业时
Client ClientToChange = Clients[index];
您正在ClientToChange
对Clients[index]
的对象进行引用,而不是复制它。它们都恰好指向同一个对象。有意义的是,当您更改它时,您会看到这些更改,无论您使用哪个名称(数组中的引用只是一种特定类型的名称)。
如果你想要一个不同的对象,你应该copy it。
您的字符串大小写未显示此行为的原因是因为在这种情况下,您不是修改包含的字符串,而是更改名称以指向另一个对象。更改一个名称指向的内容不会改变其他名称所指向的内容。如果你要改变字符串(你不能这样做,因为C#字符串是不可变的),那么当你通过数组访问它时你会看到变化。