for循环中的逻辑错误在哪里

Bel*_*nzo 4 c# for-loop concatenation

public class Client
{
    public string nome;
}

Client j, h, m, n;
j = h = m = n = new Client();

Client[] c= new Client[]{j,h,m,n};
int[] n = new int[c.Length];

for (int i = 0; i < c.Length; ++i)
{
    n[i] =i;
    c[i].nome = "Client"+i;

}
Run Code Online (Sandbox Code Playgroud)

在输出中n = 0,1,2,3;

但在输出中 c = Client4,Client4,Client4,Client4

我不是编程的新生,但我无法弄清楚为什么它不会连接每一个值.我无法向自己解释.c[i]它有,它应该工作.

有人能帮忙吗?

pax*_*blo 7

代码:

j = h = m = n = new Client();
Run Code Online (Sandbox Code Playgroud)

创建j,h,mn一个引用单一的新对象.

因此,该行将c[i].nome = "Client"+i;设置该nome单个对象的字段,覆盖先前循环迭代已经对其进行的所有更改.换句话说,你拥有的是:

 j ---+
      |    +-------------+
 h ---+--> | single item |
      |    +-------------+
 m ---+
      |
 n ---+
Run Code Online (Sandbox Code Playgroud)

如果你想要不同的对象,你需要使用类似的东西:

j = new Client();
h = new Client();
m = new Client();
n = new Client();
Run Code Online (Sandbox Code Playgroud)

这样,当您更改其中一个对象时,它不会影响其他对象:

      +------+         +------+
j --> | item |   h --> | item |
      +------+         +------+
      +------+         +------+
m --> | item |   n --> | item |
      +------+         +------+
Run Code Online (Sandbox Code Playgroud)

而且,顺便说一句,如果你正在寻找一种源代码大小有效的方法(从你的评论中可以看出这种情况),你可以尝试摆脱中间人.

无论如何都不需要那些j/h/m/n临时引用和使用单字符变量名的真正借口.嗯,i当然除了:-)

这将是::

Client[] clientArray = new Client[] {
    new Client(), new Client(), new Client(), new Client()
};
int[] numArray = new int[clientArray.Length];
for (int i = 0; i < clientArray.Length; ++i) {
    numArray[i] = i;
    clientArray[i].nome = "Client" + i;
}
Run Code Online (Sandbox Code Playgroud)