我不太确定当我运行下面的代码时使用C#将四个值(a,b,c,d)添加到我的哈希表中时到底发生了什么。但我确实知道答案错了。循环完成后,我的哈希表中存储了4个ds。请帮助我!
Hashtable cirlTmp = new Hashtable();
CycleLink mycylink = new CycleLink();
int i = 0;
for (i = 0; i < 4; i++)
{
mycylink.link_id = i;
mycylink.begine_state = i;//
mycylink.end_state = 1 + i;
mycylink.proscDescrp = (process_descrp)i;
lock (cirlTmp.SyncRoot)
{
cirlTmp.Add(i, mycylink);
}
}
我在cirlTemp中得到的是
[3]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;
[2]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;
[1]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;
[0]: link_id=3 begine_state=3 end_state=4 proscDesrp=4;
.......任何提示都会有所帮助!感谢
答案 0 :(得分:2)
在for循环中移动你的CycleLink声明,你只需要在Hashtable中的4个位置引用同一个对象而不是4个不同的对象
并且您的对象的值只是您在循环的最后一次运行中设置的值,即 i 3
时Hashtable cirlTmp = new Hashtable();
int i = 0;
for (i = 0; i < 4; i++)
{
CycleLink mycylink = new CycleLink();
mycylink.link_id = i;
mycylink.begine_state = i;//
mycylink.end_state = 1 + i;
mycylink.proscDescrp = (process_descrp)i;
lock (cirlTmp.SyncRoot)
{
cirlTmp.Add(i, mycylink);
}
}
答案 1 :(得分:1)
其他答案都是正确的,您需要在mycylink
循环内移动for
的初始化。
这就是原因。
您宣布CycleLink
。你现在开始循环。你配置它。您将其添加到hashmap。一切都好。
你转到循环中的下一个元素。您仍然将指向同一CycleLink
。您修改CycleLink
的值并将其添加到hashmap。你再做两次......
相反,你想要创建四个CycleLink
并每次添加它们。
答案 2 :(得分:0)
基本上,您将对同一对象的引用添加四次。每次更新此对象的任何属性时,这都将反映在所有hastable条目中,因为它们都引用了同一个对象。
只需在for
循环中移动以下行:
for (i = 0; i < 4; i++)
{
CycleLink mycylink = new CycleLink();
// ...