【问题标题】:Issue passing in a DataRow Type using Ref within C#在 C# 中使用 Ref 传入 DataRow 类型的问题
【发布时间】:2019-09-24 22:56:10
【问题描述】:

我正在使用“for”或“foreach”循环遍历 DataTable,然后尝试使用“Ref”将 DataRow 传递给另一个方法,以引用我需要修改的行。但是,然后我看到以下错误:

属性或索引器不能作为 out 或 ref 参数传递

我想将 DataRow 传递到我的方法中,因为这会否定进一步的代码块来更新原始 DataTable。这可能吗?

我尝试了以下方法:

// Build request
for(int x = 0; x < (dt.Rows.Count -1); x++)
{
    if (dt.Rows[x]["FieldData"].ToString().Trim() == "Value")
    {
        // Do work
        DoWork.BuildRequest(ref dt.Rows[x], ref Result);
    }
}     

还有:

// Build request
foreach(DataRow row in dt.Rows)
{
    if (row["FieldData"].ToString().Trim() == "Value")
    {
        // Do work
        DoWork.BuildRequest(ref row, ref Result);
    }
}

【问题讨论】:

  • 我认为您误解了ref 在这里所做的事情。你不需要它,因为你不需要改变你传递的对象的 instance,你只是在修改它的内部属性。
  • “因为这否定了进一步的代码块来更新原始 DataTable” 似乎你试图滥用 ref, lock DataTable 如果你不这样做'迭代时不想更新
  • 我使用 ref 传递它,因为它调用另一个类的方法。我想修改传递给该方法的原始行,而不必返回 DataRow 并编写更多代码来更新 DataTable 中的原始行。我认为 ref 是最好的使用案例。
  • 肯定将 DataRow 传入方法(没有 ref)不允许我修改原始行?如果我错了,请纠正我。也谢谢大家的帮助

标签: c# .net wcf


【解决方案1】:

正如其他人指出的那样, ref 很可能是不必要的。类已经通过引用传递,只有当类型 'Result' 是由 DoWork.BuildRequest 修改的 structure 时,您才需要 ref 关键字(因为它们是按值复制的,而更改的值不会向上传播调用堆栈)。为清晰起见删除可能是最佳选择。但是,如果您不能或这是您无法更改其签名的代码,您可以获取本地引用并传递它。

foreach(DataRow row in dt.Rows)
{
  if (row["FieldData"].ToString().Trim() == "Value")
  {
    var dr = row;
    // Do work
    DoWork.BuildRequest(ref dr, ref Result);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2012-04-06
    • 2019-04-21
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多