c#dictionary赋值变量的值

时间:2015-10-29 08:26:53

标签: c# variables dictionary

我在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

似乎作业是通过参考而非价值...... 也许你可以帮助我分配类变量的实际值而不是它的参考?

4 个答案:

答案 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

祝你好运