我在c#中将变量的值赋给字典时遇到了一些麻烦。
这是一个例子。我有以下课程:
public class test_class
{
public int val1;
public int val2;
}
我正在运行以下代码:
Dictionary<int, test_class> tmp_dict = new Dictionary<int, test_class>();
tmp_test.val1 = 1;
tmp_test.val2 = 1;
tmp_dict.Add(1, tmp_test);
tmp_test.val1 = 2;
tmp_test.val2 = 2;
tmp_dict.Add(2, tmp_test);
foreach (KeyValuePair<int, test_class> dict_item in tmp_dict)
{
Console.WriteLine("key: {0}, val1: {1}, val2: {2}", dict_item.Key, dict_item.Value.val1, dict_item.Value.val2);
}
现在,我希望获得以下输出(key1的值为1)
key: 1, val1: 1, val2: 1
key: 2, val1: 2, val2: 2
但我得到以下一个(key1也得到2的值):
key: 1, val1: 2, val2: 2
key: 2, val1: 2, val2: 2
似乎作业是通过参考而非价值...... 也许你可以帮助我分配类变量的实际值而不是它的参考?
答案 0 :(得分:4)
您只创建test_class
的单个实例,并将该实例两次添加到字典中。通过在再次将其添加到字典之前对其进行修改,您还会影响已添加的实例 - 因为它是相同的实例,在字典中只有多个对它的引用。
因此,不是修改一个对象,而是创建新对象:
test_class tmp_test;
// create a new object
tmp_test = new test_class();
tmp_test.val1 = 1;
tmp_test.val2 = 1;
tmp_dict.Add(1, tmp_test);
// create another new object
tmp_test = new test_class();
tmp_test.val1 = 2;
tmp_test.val2 = 2;
tmp_dict.Add(2, tmp_test);
由于新对象已分配给tmp_test
,因此添加到词典的引用现在是对 new 对象的引用,因此它独立于我们的第一个对象添加到字典中。
但请记住,对象仍然是可变的,所以你可以做这样的事情就好了,它会修改字典中的对象(以及其他地方对它们的引用存在):
tmp_dict[1].val1 = 123;
tmp_dict[2].val2 = 42;
答案 1 :(得分:3)
您的假设绝对正确,它与参考文献有关。当您只是更改test_class
实例的属性时,这些更改将反映在对该实例的所有引用中。您可以考虑创建一个新实例:
tmp_test = new test_class();
tmp_test.val1 = 1;
tmp_test.val2 = 1;
tmp_dict.Add(1, tmp_test);
tmp_test1 = new test_class();
tmp_test1.val1 = 2;
tmp_test1.val2 = 2;
tmp_dict1.Add(2, tmp_test1);
另外将您的参考tmp_test
重新分配给新实例:tmp_test = new test_class()
。
注意:类名应为 PascalCase (在您的情况下为TestClass
)
答案 2 :(得分:1)
你可以更轻松地做到这一点:
tmp_dict.Add(1, new test_class{val1 = 1, val2 = 1;});
tmp_dict.Add(2, new test_class{val1 = 2, val2 = 2;});
答案 3 :(得分:0)
java:global/org.wso2.carbon.custom.ejb-1.0-SNAPSHOT/HelloBean!org.wso2.carbon.custom.ejb.HelloIF
java:app/org.wso2.carbon.custom.ejb-1.0-SNAPSHOT/HelloBean!org.wso2.carbon.custom.ejb.HelloIF
java:module/HelloBean!org.wso2.carbon.custom.ejb.HelloIF
java:jboss/exported/org.wso2.carbon.custom.ejb-1.0-SNAPSHOT/HelloBean!org.wso2.carbon.custom.ejb.HelloIF
java:global/org.wso2.carbon.custom.ejb-1.0-SNAPSHOT/HelloBean
java:app/org.wso2.carbon.custom.ejb-1.0-SNAPSHOT/HelloBean
java:module/HelloBean
祝你好运