带有ref参数的c静态方法-一个好主意
本文关键字:一个 好主意 参数 ref 静态方法 带有 | 更新日期: 2023-09-27 17:59:11
我最近重构了一些代码,现在有了一个静态实用程序类,方法如下:
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的代码后面调用doWork方法的不良影响吗。NET应用程序受到许多用户的攻击?有人知道或有参考资料,我可以在那里了解静态方法的性能如何?这会成为任何形式的瓶颈吗?
编辑:
是的,我很抱歉这不是一个很好的例子,所以让我们说一个更像这样的例子:
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,因为ref已经传递了Datatable,B)将所有调用"集中"到单个静态方法根本不会影响性能。
您唯一需要通过ref传递引用类型(如Datatable)的时间是,如果您计划将参数分配给类的新实例。在这种情况下不需要Ref。按值传递。
ref
关键字不用于性能目的。当您想更改另一个作用域中的变量指向时,就会使用它(简单地说)。在这种情况下,您对ref
的使用是无关的,可能会在将来导致问题。
我对ref
的经验法则是:如果你正在使用它,你可能不应该使用。
最后,为了回答您关于性能的问题:使用ref
不会改变现有方法的性能包络
阅读您的编辑后,以下是您两个问题的直接答案:
- 正确,使用
ref
只会引起混乱,因为这不是它的预期用途(也不是为了性能) - 正确,使用带有
const
ID变量的static
方法不太可能以任何可衡量的方式提高您的场景的性能
AFAIK静态方法并不比实例方法慢。相反,它们实际上可能会稍微快一点,因为您不需要传递隐藏的this
,也不需要进行虚拟调用。
DataTable已作为引用传递,因此不需要ref
对于您的方法,不需要"ref"关键字。
DataTable是通过引用传递内容的类实例。由于不更改对对象的引用,因此不需要"ref"关键字。
使用ref
时,static
方法根本不会提高性能。有关ref
的更多说明,请参阅此。