【问题标题】:c# static method with ref parameter - a good idea?c# 带有 ref 参数的静态方法 - 好主意吗?
【发布时间】:2011-09-14 18:51:55
【问题描述】:

我最近重构了一些代码,现在有一个静态实用程序类,其方法如下:

const int x = 1;
public static string doWork(ref DataTable dt)
{
    decimal total = 0;
    foreach (DataRow row in dt.Select("COST_ID = " + x))
    {
        decimal annual = decimal.Parse(row["Cost"].ToString());
        total += decimal.Round(annual, 2);
    }
    return String.Format("{0:C}", total);
}

为了清楚起见,我已经简化了示例...

这样做并在许多用户点击的 ASP.NET 应用程序背后的代码中调用 doWork 方法,我是否可能会遇到任何不良影响?任何人都知道或有参考资料,我可以在其中阅读有关性能方面的静态方法如何工作的信息?这会成为任何类型的瓶颈吗?

编辑:

是的,我很抱歉这不是一个很好的例子,所以让我们说更多这样的话:

const int x = 1;
public static string doWork(ref DataTable dt)
{
    foreach (DataRow row in dt.Select("COST_ID = " + x))
    {
        row["Cost"] = 0.0;
    }
}

您是说 A)我实际上什至不需要这里的 ref,因为 Datatable 已经由 ref 传递,B)性能完全没有受到“汇集”对单个静态方法的所有调用的影响。

【问题讨论】:

  • 为什么datatable需要是一个ref?
  • 为什么还要按引用传递呢?你没有做任何需要参考的事情。
  • 如果您担心性能,请对其进行分析。这极不可能成为瓶颈。避免过早优化。
  • 你说得对,这实际上不是一个很好的例子,我会更新问题。

标签: c# methods parameters static ref


【解决方案1】:

对于您的方法,“ref”关键字不是必需的。

【讨论】:

    【解决方案2】:

    DataTable 已经作为引用传递,所以不需要 ref

    【讨论】:

    • 谢谢,确定各种对象的引用/值传递的经验法则是什么?它与类与结构中的“类是引用类型”语句有什么关系。msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx 都是默认引用的对象,因此 DataTable 是默认引用的?
    • 找到了,“Reference Types”和“Value Types”很直接,谢谢大家的回答都对。
    【解决方案3】:

    DataTable 是通过引用传递的类实例。由于您不更改对对象的引用,因此“ref”关键字不是必需的。

    【讨论】:

      【解决方案4】:

      AFAIK 静态方法并不比实例方法慢。相反,它们实际上可能会稍微快一些,因为您不需要传递隐藏的this 并可能进行虚拟调用。

      【讨论】:

      • ...除非您正在编写设备驱动程序,否则没关系。我永远不会在那个级别进行微优化。
      【解决方案5】:

      您唯一需要通过 ref 传递引用类型(例如 Datatable)的情况是,如果您计划将参数分配给类的新实例。在这种情况下不需要 Ref。按值传递。

      【讨论】:

        【解决方案6】:

        ref 关键字不用于性能目的。 It is used when you would like to alter what a variable in another scope points-to (in simple terms). 在这种情况下您对 ref 的使用是无关紧要的,并且可能会导致将来出现问题。

        我对@9​​87654324@ 的经验法则是:如果你正在使用它,你可能不应该使用它。

        最后,回答您关于性能的问题:使用ref 不会改变现有方法的性能范围。


        阅读您的编辑后,以下是您两个问题的直接答案:

        1. 正确,使用 ref 只会引起混淆,因为这不是它的预期用途(也不是用于性能)。
        2. 正确,使用 static 方法和 const ID 变量不太可能以任何可衡量的方式提高您的方案的性能。

        【讨论】:

          【解决方案7】:

          当您使用ref 时,static 方法根本不会提高性能。有关ref 的更多说明,请参阅This.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-04
            • 2015-09-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多