【问题标题】:Is DataTable passed by reference? [duplicate]DataTable 是通过引用传递的吗? [复制]
【发布时间】:2014-08-07 21:56:08
【问题描述】:

这听起来像是一个愚蠢的问题,但我只是偶然发现了这个问题。我知道您可以使用ref 通过引用传递参数。但是我有这个方法

    public void SaveRecordsIntoTemporaryTable(DataTable objDataTable, string userSessionID)
   {

       // The objDataTable has 5 columns "Id", "Name", "Tag_1", "Tag_2", "Tag_3"
       // Now in here I remove "Tag_1", "Tag_2", and "Tag_3"
       objDataTable.Columns.Remove("Tag_1");
       objDataTable.Columns.Remove("Tag_2");
       objDataTable.Columns.Remove("Tag_3");

       ...

   }

现在我在第三行设置了一个调试点,但是在删除此列"Tag_3" 并将光标悬停在参数中的objDataTable 上后,它显示的DataTable 也删除了列?那么,它是通过引用传递的吗?

更新

好的,如果被reference通过,我用ref会有什么不同?

【问题讨论】:

  • 因为DataTable 是一个引用类型。
  • @Razort4x,参考您的编辑:它不是通过引用传递的。但是当您使用ref 关键字时,您可以修改原始引用,例如将其设置为null

标签: c# .net


【解决方案1】:

那么,它是通过引用传递的吗?

它的地址是按值传递的。由于DataTable 是一个类(引用类型),它的地址是按值传递的,因此您会看到变化。

尝试做:

objDataTable = null;

如果它确实是通过引用传递的,那么您将看到调用者将DataTable 设置为null,但不会发生

见:Parameter passing in C# by Jon Skeet

【讨论】:

    【解决方案2】:

    DataTable,以及从对象派生的任何其他内容都通过引用传递。如果您将其显式传递为 ref,则引用将是通过引用 - 允许您将变量更改为指向另一个 DataSet(或 null)。

    编辑 - 忽略第一句话。它应该是 DataTable 并且从 object 派生的任何其他内容都是引用类型。

    调用按值传递引用类型的方法仍然允许修改类型的属性。

    【讨论】:

    • 不,它不是通过引用传递的。它一个引用,它是按值传递的。这是一个非常重要的区别。
    • 重读我说的话。 如果他要通过引用传递ref,那么它将是对引用的引用。正如您所说,现有代码确实通过值传递引用。
    • 看来你对发生的事情有正确的理解。但是,说“... 通过引用传递”是不正确的。引用传递语义是明确定义的,这不是这里发生的情况。
    • @DavidCrowell 你的第一句话,DataTable, and anything else derived from object is passed by reference. 是错误的。你的第二句话没有错,但你的第一句话是。
    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 2011-02-12
    • 2021-05-20
    • 2010-10-10
    • 2014-12-21
    相关资源
    最近更新 更多