使用ref和this来改变变量值

时间:2015-07-12 13:25:00

标签: c# arguments this ref

我最近遇到了ref和这个参数关键字,我找不到任何好的比较性能。

void main()
{
    int original = 1;

    /* Which one is best? */
    original = DoMaths(original, 2);
    DoMaths(ref original, 2);
    original = original.DoMaths(2);
}

int DoMaths(int original, int arg)
{
    return original * arg;
}

void DoMaths(ref int original, int arg)
{
    original *= arg;
}

int DoMaths(this int original, int arg)
{
    return original * arg;
}

1 个答案:

答案 0 :(得分:0)

  

我最近遇到过ref和这个参数关键字,我无法找到明智的比较性能

您没有找到好的比较,因为无法进行有意义的比较。

代码示例中使用的this关键字对运行时性能的影响确实 no 。它严格地是向编译器发信号的标记,即声明的方法是扩展方法。您发布的代码甚至无法编译(扩展方法必须为static,并且它们仅在同样为static的类中合法),但是当它们被正确声明和使用时,它们只影响代码的编译时语义,允许您将调用写入方法,就好像它是使用第一个参数调用的实例方法(标有this

否则,它与调用任何其他static方法完全相同,并且具有完全相同的性能特征。并且比较static方法与使用by-reference参数(通过refout)的方法之间的性能也毫无意义。这两者甚至不是相互排斥的。

即使你想到一个问题,比较使用ref与其他一些其他可比较方案的问题,其他人通常也无法以有用的方式回答这个问题,尤其是没有{{3这清楚地说明了这个问题。即使有这样的例子,也不太可能得到有用的答案,因为这样的代码示例必然与现实世界的背景分离,其中实际的性能可能是一个问题。即任何答案都主要是学术价值。

在这样的论坛中,对于一个问题的最佳和唯一合理的答案采取"哪些表现更好?"是"当在现实场景中测试它时表现更好?"

最后,请注意,通过引用传递会显着改变方法的语义。因此,即使在性能受到关注的情况下,即使实际发生通过引用提高了性能,也应该非常谨慎地将ref仅用作性能增强措施。单个方法调用是一个重要的性能瓶颈是非常罕见的,与语义正确的实现相比,通过引用传递可能产生足够显着的性能差异,以证明损害代码的表达能力是不太可能的。那样。