C# 使用简单的=
我有一个关于by ref问题的变体。我知道如何使用ref或参数调用,以及它如何影响变量及其值。我对DataTable有这个问题,我想知道为什么DataTable不同于简单的整数变量 我有解决问题的物理答案,但我想知道为什么它会这样工作 如果你使用简单的变量,它会达到我的预期C# 使用简单的=,c#,reference,datatable,pass-by-reference,byref,C#,Reference,Datatable,Pass By Reference,Byref,我有一个关于by ref问题的变体。我知道如何使用ref或参数调用,以及它如何影响变量及其值。我对DataTable有这个问题,我想知道为什么DataTable不同于简单的整数变量 我有解决问题的物理答案,但我想知道为什么它会这样工作 如果你使用简单的变量,它会达到我的预期 int mVar1 = 1; int mVar2 =1; mVar2 = mVar1; mVar2 = 5; Console.WriteL
int mVar1 = 1;
int mVar2 =1;
mVar2 = mVar1;
mVar2 = 5;
Console.WriteLine(mVar1.ToString());
Console.WriteLine(mVar2.ToString());
它显示
1,5
在控制台中
但是,如果对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();
所以我的问题是:是什么导致datatable与简单整数字段的执行方式不同。当我使用mVar4=mVar3而不是数据表的另一个副本时,为什么它会创建一个引用?调用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引用的对象。您遇到了引用类型和值类型之间的差异 这里有一个关于差异的例子 一个更具描述性的答案是,两者实际上都在执行相同的操作,区别在于在第一个示例(两个整数)中,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;
}
我喜欢MSDN文章,因为它解释了什么类型的东西。现在我看到,当我在VisualStudio中将鼠标悬停在DataTable数据类型上时,它会显示类DataTable,根据MSDN文章,它是一个引用类型。谢谢你的信息,它解释了一切!请注意,datatable已经有一个复制方法。