3

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

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)性能完全没有受到“汇集”对单个静态方法的所有调用的影响。

4

7 回答 7

8

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

于 2011-06-14T14:56:29.243 回答
5

ref关键字不用于性能目的。当您想更改另一个作用域中的变量指向的内容时(简单来说),使用它。在这种情况下,您的使用ref是无关紧要的,并且可能会导致将来出现问题。

我的经验法则ref是:如果你正在使用它,你可能不应该使用它。

最后,回答你关于性能的问题:使用ref不会改变手头方法的性能包络。


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

  1. 正确,使用ref只会引起混淆,因为这不是它的预期用途(并且它不用于性能)。
  2. 正确,使用static带有constID 变量的方法不太可能以任何可衡量的方式提高您的场景的性能。
于 2011-06-14T14:57:13.257 回答
2

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

于 2011-06-14T14:55:23.227 回答
1

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

于 2011-06-14T14:53:50.540 回答
1

DataTable 已作为参考传递,因此不需要 ref

于 2011-06-14T14:54:27.377 回答
1

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

于 2011-06-14T14:54:56.763 回答
0

并非所有static方法都不会在您使用时提高性能ref。有关更多说明,ref请参阅此。

于 2011-06-14T15:20:42.500 回答