使用 ref 和 this 更改变量值

Use of ref and this to change a variable value

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

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;
}

I came across ref and this parameter keywords lately, and I can't find any good comparison performance wise

您找不到合适的比较,因为不可能进行有意义的比较。

您的代码示例中使用的 this 关键字实际上对运行时性能 没有 影响。它严格来说是一个标记,向编译器发出信号,表明所声明的方法是一个扩展方法。您发布的代码甚至无法编译(扩展方法必须是 static,并且它们仅在 class 也是 static 中合法),但是当它们被声明和如果使用得当,它们只会影响代码的编译时语义,允许您将 call 写入方法,就好像它是使用第一个参数调用的实例方法(用 this).

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

即使你想出一个问题,将 ref 的使用与其他一些可比较的场景进行比较,其他人通常不可能以有用的方式回答这个问题,尤其是没有 a good, minimal, complete code example 清楚地说明了问题。即使有这样的例子,也不太可能得到有用的答案,因为这样的代码示例必然脱离现实世界的上下文,在现实世界中,实际性能可能是一个问题。 IE。任何答案都将主要具有学术价值。

在这样的论坛中,对于 "which of these performs better?" 形式的问题,最好且唯一合理的答案是 "which performed better when you tested it in your real-world scenario?"

最后,请注意通过引用传递显着改变了方法的语义。因此,即使性能是一个问题,即使确实发生了按引用传递提高性能,人们也应该非常谨慎地使用 ref 仅作为一种性能增强措施。单个方法调用成为重大性能瓶颈的情况极为罕见,与语义正确的实现相比,通过引用传递可能产生足够显着的性能差异以证明损害代码的表达能力的可能性更小那样。