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

时间:2018-06-20 07:33:16

标签: 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;

}

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

但在c = Client4,Client4,Client4,Client4

的输出中

我不是编程的新生,但是我无法弄清楚为什么它没有将每个i值串联在一起。 我无法向自己解释。有c[i],它应该可以工作。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:7)

代码:

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

创建对单个新对象的jhmn引用。

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

 j ---+
      |    +-------------+
 h ---+--> | single item |
      |    +-------------+
 m ---+
      |
 n ---+

如果要使用与众不同的对象,则需要使用以下类似的内容:

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

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

      +------+         +------+
j --> | item |   h --> | item |
      +------+         +------+
      +------+         +------+
m --> | item |   n --> | item |
      +------+         +------+

并且,顺便说一句,如果您正在寻找一种有效的,节省资源的方法(就像您的评论中所说的那样),则可以尝试摆脱中间人。

始终不需要那些j/h/m/n临时引用,也没有 real 使用单字符变量名称的借口。好吧,当然不是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;
}