c#带ref参数的静态方法 - 一个好主意?

时间:2011-06-14 14:51:19

标签: c# methods parameters static ref

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

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)通过“漏斗”所有对单个静态方法的调用,根本没有达到性能。

7 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

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

我对ref的经验法则是:如果你使用它,你可能不应该这样做。

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


阅读完编辑后,这里有两个问题的直接答案:

  1. 正确,使用ref只会导致混淆,因为这不是它的预期用途(并且它不用于性能)。
  2. 正确,使用带有static ID变量的const方法不太可能以任何可衡量的方式改善您的方案的效果。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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