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 的使用是无关紧要的,并且可能会导致将来出现问题。

我对@9​​87654324@ 的经验法则是:如果你正在使用它,你可能不应该使用它。

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


阅读您的编辑后,以下是您两个问题的直接答案:

    正确,使用 ref 只会引起混淆,因为这不是它的预期用途(也不是用于性能)。 正确,使用 static 方法和 const ID 变量不太可能以任何可衡量的方式提高您的方案的性能。

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于c# 带有 ref 参数的静态方法 - 好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

Mono 和 C# IOCP:这是个好主意吗?

使用带有特殊字符的 URL 名称是个好主意吗? [关闭]

将静态库链接到共享库(例如openmp)是一个好主意

在小数据集上使用 GridSearch 并在大数据集上应用结果是个好主意吗?

C# C++/CLR 处理 ref 参数和字符串指针

通过 express req 参数传递解码的 jwt 数据是个好主意吗?