问题描述
|
我最近重构了一些代码,现在有了一个带有以下方法的静态实用程序类:
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)对该单个静态方法的所有调用都无法完全“降低”性能。
解决方法
ref
关键字不用于性能目的。当您想要更改另一个作用域中的变量指向(简单地说)时,可以使用它。在这种情况下,您使用ref
是多余的,并且将来可能会导致问题。
我对ref
的经验法则是:如果您正在使用它,则可能不应该这样做。
最后,回答关于性能的问题:使用ref
不会改变现有方法的性能范围。
阅读您的修改后,以下是您的两个问题的直接答案:
正确,使用ѭ2只会引起混淆,因为这不是其预期用途(并且不用于性能)。
正确,对ID变量使用const
ID的static
方法不可能以任何可衡量的方式提高性能。
, 唯一需要通过ref传递引用类型(例如Datatable)的时间是,如果您计划将参数分配给类的新实例。在这种情况下,不需要引用。通过值传递它。
, AFAIK静态方法并不比实例方法慢。相反,它们实际上可能会更快一些,因为您不需要传递隐藏的ѭ9并可以进行虚拟调用。
, DataTable已作为参考传递,因此不需要ref
, 对于您的方法,不需要\“ ref \”关键字。
, DataTable是通过引用传递的类的实例。由于您不更改对对象的引用,因此不需要\“ ref \”关键字。
, 当您使用ѭ2时,7ѭ法根本不会提高性能。有关ref
的更多说明,请参见此。