C# 为什么属性直接设置为输出预期的数字,而属性间接设置为等于最后一个设置的数字?

C# 为什么属性直接设置为输出预期的数字,而属性间接设置为等于最后一个设置的数字?,c#,object,properties,C#,Object,Properties,为什么属性直接设置为输出预期的数字,而属性间接设置为等于最后一个设置的数字?对所有代码表示歉意,但这是实际代码的简化版本 以下代码输出: 1 // 9 2 // 9 3 // 9 4 // 9 5 // 9 6 // 9 7 // 9 8 // 9 9 // 9 应在何时输出: 1 // 1 2 // 2 3 // 3 4 // 4 5 // 5 6 // 6 7 // 7 8 // 8 9 // 9 代码 使用系统; 使用System.Collections.Generic; 公开课考试

为什么属性直接设置为输出预期的数字,而属性间接设置为等于最后一个设置的数字?对所有代码表示歉意,但这是实际代码的简化版本

以下代码输出:

1 // 9
2 // 9
3 // 9
4 // 9
5 // 9
6 // 9
7 // 9
8 // 9
9 // 9
应在何时输出:

1 // 1
2 // 2
3 // 3
4 // 4
5 // 5
6 // 6
7 // 7
8 // 8
9 // 9
代码

使用系统;
使用System.Collections.Generic;
公开课考试
{
公共静态void Main()
{
int x=0;
示例原始示例=新示例(0);
列表示例=新列表();
而(++x<10)
{
示例。添加(新示例(原始示例,x));
}
foreach(示例中的示例)
Console.WriteLine(_example.number1+“/”+_example.number2);
}
公开课范例
{
公共整数1;
public int number2{get{返回(int)值[“number”];}
public bool original=true;
字典值=新字典();
公共示例(整数)
{
原始=真实;
number1=数字;
值。添加(“数字”,数字);
}
公共示例(示例原始_示例,整数)
{
原件=假;
值=原始值;
值[“数字”]=数字;
number1=数字;
}
}
}

问题在这里:
values=original\u example.values

我们将引用类型
字典
的内存地址分配给指向内存中相同地址的新变量。对此新变量所做的任何更新都会影响同一对象

相反,为了达到预期的结果,请复制字典。这可以通过创建新词典并将原始词典传递到cstor来实现:

        public example(example original_example, int number)
        {
            original = false;
            values = new Dictionary<string, object>(original_example.values);//Copy
            values["number"] = number;
            number1 = number;
        }
公共示例(示例原始\u示例,整数)
{
原件=假;
values=新字典(原始的_示例.values);//复制
值[“数字”]=数字;
number1=数字;
}

包含有关引用类型主题的详细信息。另请参阅相关主题。

问题在这里:
values=original\u example.values

我们将引用类型
字典
的内存地址分配给指向内存中相同地址的新变量。对此新变量所做的任何更新都会影响同一对象

相反,为了达到预期的结果,请复制字典。这可以通过创建新词典并将原始词典传递到cstor来实现:

        public example(example original_example, int number)
        {
            original = false;
            values = new Dictionary<string, object>(original_example.values);//Copy
            values["number"] = number;
            number1 = number;
        }
公共示例(示例原始\u示例,整数)
{
原件=假;
values=新字典(原始的_示例.values);//复制
值[“数字”]=数字;
number1=数字;
}

包含有关引用类型主题的详细信息。另请参阅相关主题。

当您执行“values=original\u example.values”时,您正在共享来自原始\u示例的字典实例,因此所有对象都有一个具有单个值的字典。当您执行“values=original\u example.values”时,您正在共享来自原始\u示例的字典实例,因此,对于所有对象,只有一个字典有一个值。+1谢谢。我不知道我在修改原稿。真奇怪。这很好,已经测试过了。但是有没有替代方法?@iambriansreed-您使用的是引用类型值的副本,它只是内存中的一个地址。因此,您正在修改同一对象。我不知道你在找什么样的替代品?解决方案有什么问题?再次感谢。我被参考问题弄糊涂了。你能给我指些什么文件吗?@iambriansreed,Jon,Skeet和Eric,Lippert在这个问题上有好几个很好的分类。一个地方开始:+1谢谢。我不知道我在修改原稿。真奇怪。这很好,已经测试过了。但是有没有替代方法?@iambriansreed-您使用的是引用类型值的副本,它只是内存中的一个地址。因此,您正在修改同一对象。我不知道你在找什么样的替代品?解决方案有什么问题?再次感谢。我被参考问题弄糊涂了。你能给我指些什么文件吗?@iambriansreed,Jon,Skeet和Eric,Lippert在这个问题上有好几个很好的分类。一个起点: