我最近重构了一些代码,现在有一个静态实用程序类,其方法如下:
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)通过“漏斗”所有对单个静态方法的调用,根本没有达到性能。
答案 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
不会改变现有方法的性能范围。
阅读完编辑后,这里有两个问题的直接答案:
ref
只会导致混淆,因为这不是它的预期用途(并且它不用于性能)。static
ID变量的const
方法不太可能以任何可衡量的方式改善您的方案的效果。答案 2 :(得分:2)
AFAIK静态方法并不比实例方法慢。相反,它们实际上可能稍快一些,因为您不需要传递隐藏的this
并可能进行虚拟呼叫。
答案 3 :(得分:1)
对于您的方法,不需要“ref”关键字。
答案 4 :(得分:1)
DataTable已作为参考传递,因此不需要参考
答案 5 :(得分:1)
DataTable是通过引用传递的类的实例。由于您不更改对象的引用,因此不需要“ref”关键字。
答案 6 :(得分:0)
使用static
时,ref
方法根本不会提高性能。有关ref
的更多说明,请参阅This.