c# 带有 ref 参数的静态方法 - 好主意吗?
Posted
技术标签:
【中文标题】c# 带有 ref 参数的静态方法 - 好主意吗?【英文标题】:c# static method with ref parameter - a good idea? 【发布时间】:2011-09-14 18:51:55 【问题描述】:我最近重构了一些代码,现在有一个静态实用程序类,其方法如下:
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)性能完全没有受到“汇集”对单个静态方法的所有调用的影响。
【问题讨论】:
为什么datatable需要是一个ref? 为什么还要按引用传递呢?你没有做任何需要参考的事情。 如果您担心性能,请对其进行分析。这极不可能成为瓶颈。避免过早优化。 你说得对,这实际上不是一个很好的例子,我会更新问题。 【参考方案1】:对于您的方法,“ref”关键字不是必需的。
【讨论】:
【参考方案2】:DataTable 已经作为引用传递,所以不需要 ref
【讨论】:
谢谢,确定各种对象的引用/值传递的经验法则是什么?它与类与结构中的“类是引用类型”语句有什么关系。msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx 都是默认引用的对象,因此 DataTable 是默认引用的? 找到了,“Reference Types”和“Value Types”很直接,谢谢大家的回答都对。【参考方案3】:DataTable 是通过引用传递的类实例。由于您不更改对对象的引用,因此“ref”关键字不是必需的。
【讨论】:
【参考方案4】:AFAIK 静态方法并不比实例方法慢。相反,它们实际上可能会稍微快一些,因为您不需要传递隐藏的this
并可能进行虚拟调用。
【讨论】:
...除非您正在编写设备驱动程序,否则没关系。我永远不会在那个级别进行微优化。【参考方案5】:您唯一需要通过 ref 传递引用类型(例如 Datatable)的情况是,如果您计划将参数分配给类的新实例。在这种情况下不需要 Ref。按值传递。
【讨论】:
【参考方案6】:ref
关键字不用于性能目的。 It is used when you would like to alter what a variable in another scope points-to (in simple terms). 在这种情况下您对 ref
的使用是无关紧要的,并且可能会导致将来出现问题。
我对@987654324@ 的经验法则是:如果你正在使用它,你可能不应该使用它。
最后,回答您关于性能的问题:使用ref
不会改变现有方法的性能范围。
阅读您的编辑后,以下是您两个问题的直接答案:
-
正确,使用
ref
只会引起混淆,因为这不是它的预期用途(也不是用于性能)。
正确,使用 static
方法和 const
ID 变量不太可能以任何可衡量的方式提高您的方案的性能。
【讨论】:
【参考方案7】:当您使用ref
时,static
方法根本不会提高性能。有关ref
的更多说明,请参阅This.
【讨论】:
以上是关于c# 带有 ref 参数的静态方法 - 好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章