代码之家  ›  专栏  ›  技术社区  ›  Jaydel Gluckie

使用简单的=

  •  2
  • Jaydel Gluckie  · 技术社区  · 16 年前

    我有解决问题的物理答案,但我想知道为什么它会这样工作。

    如果你使用简单的变量,它会达到我的预期

            int mVar1 = 1;
            int mVar2 =1;
    
            mVar2 = mVar1;
    
            mVar2 = 5;
    
            Console.WriteLine(mVar1.ToString());
            Console.WriteLine(mVar2.ToString());
    

    它显示 在控制台中。

    但是,如果对DataTable执行相同的操作,它将引用第一个DataTable,而不是新值:

            DataTable mVar3 = new DataTable();
            DataTable mVar4 = new DataTable();
    
    
             // Create DataColumn objects of data types.
            DataColumn colString = new DataColumn("StringCol");
            colString.DataType = System.Type.GetType("System.String");
            mVar3.Columns.Add(colString);
    
            // Create DataColumn objects of data types.
            DataColumn colString2 = new DataColumn("StringCol123");
            colString2.DataType = System.Type.GetType("System.String");
            mVar4.Columns.Add(colString2);
    
            foreach (DataColumn tCol in mVar3.Columns)
            {
                Console.WriteLine(tCol.ColumnName);
    
            }
            foreach (DataColumn tCol in mVar4.Columns)
            {
                Console.WriteLine(tCol.ColumnName);
    
            }
    
                    mVar4 = mVar3;
    
            //change mVar4 somehow and see if mVar3 changes
    
    
            foreach (DataColumn tCol in mVar4.Columns)
            {
                tCol.ColumnName = "Test";
    
            }
    
            foreach (DataColumn tCol in mVar3.Columns)
            {
                Console.WriteLine(tCol.ColumnName);
    
            }
    
            foreach (DataColumn tCol in mVar4.Columns)
            {
                Console.WriteLine(tCol.ColumnName);
    
            }
    

    控制台显示: StringCol123 测验

    通过说mVar4=mVar3,它使mVar4成为mVar3的引用。

    这个问题的解决办法是

    DataTable mVar4 = mVar3.Copy(); 
    

    2 回复  |  直到 16 年前
        1
  •  2
  •   Joseph    16 年前

    msdn article 关于分歧。

    一个更具描述性的答案是,两者实际上都在执行相同的操作,区别在于在第一个示例(两个整数)中,mVar2=mVar1的赋值是将mVar1的值赋值给mVar2,即1。但是,对于DataTable,实际分配的是内存位置,而不是DataTable。

    例如,假设您创建的数据表驻留在内存位置20中。这将意味着参考mVar1将持有对该位置的参考(20)。当您执行赋值mVar2=mVar1时,您告诉mVar2保持与mVar1相同的值,因此mVar2也会引用内存位置20。结果是两个变量引用相同的数据表。

    对于DataTable类,可以在扩展方法中对其进行如下扩展:

    public static DataTable Copy(this DatTable original)
    {
       var result = new DataTable();
       //assume Property1 was a property of a DataTable
       result.Property1 = original.Property1; 
       //continue copying state from original to result
       return result;
    }
    
        2
  •  0
  •   Timothy Carter    16 年前

    调用mVar2=mVar1;复制存储在mVar1位置的值。在这种情况下,这意味着1被复制到位置mVar2中。在第二种情况下,存储在mVar3的值再次复制到mVar4的位置。但是,在这种情况下,因为DataTable是引用类型,所以复制的值是对实际DataTable对象的引用。

    要进一步显示这一点,请在您发布的代码末尾添加以下内容:

            mVar4 = new DataTable();
            // Create DataColumn objects of data types.
            DataColumn colString3 = new DataColumn("StringCol1234");
            colString2.DataType = System.Type.GetType("System.String");
            mVar4.Columns.Add(colString3);
    
            foreach (DataColumn tCol in mVar3.Columns)
            {
                Console.WriteLine(tCol.ColumnName); // still outputs test
    
            }
    
            foreach (DataColumn tCol in mVar4.Columns)
            {
                Console.WriteLine(tCol.ColumnName); // now outputs StringCol1234
    
            }
    

    这里,如果再次将mVar4设置为DataTable的新实例,则所做的更改不会反映在mVar3中。这是因为调用mVar4=newdatatable();更改mVar4位置处的引用,但不会更改mVar4引用的对象。