gpt4 book ai didi

c# - 使用简单 = 的引用问题不同

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:28 26 4
gpt4 key购买 nike

我有一个关于 by ref 问题的变体。我知道所有关于使用 ref 或我们的参数调用以及它如何影响变量及其值。我在使用 DataTable 时遇到了这个问题,我想知道为什么数据表不同于简单的整数变量。

我有关于如何解决问题的实际答案,但我想知道为什么它会这样工作。

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

        int mVar1 = 1;
int mVar2 =1;

mVar2 = mVar1;

mVar2 = 5;

Console.WriteLine(mVar1.ToString());
Console.WriteLine(mVar2.ToString());

显示1,5在控制台中。

但是如果您对 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(); 

所以我的问题是:是什么导致数据表的执行方式与简单的整数字段不同。为什么当我使用 mVar4 = mVar3 而不是 DataTable 的不同副本时它会创建一个引用?

最佳答案

您遇到了引用类型和值类型之间的差异。

这是一个 msdn article关于差异。

更具描述性的答案是两者实际上执行相同的操作,不同之处在于在第一个示例(两个整数)中,mVar2 = mVar1 的赋值是将 mVar1 的值赋给 mVar2,即 1。但是,对于 DataTable,实际分配的是内存位置,而不是 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;
}

关于c# - 使用简单 = 的引用问题不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1033385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com