假设有一个8-16字节的结构Foo
。它有一个静态方法将Add()
所有值传递给另一个结构,性能至关重要。我见过很多静态方法,如下所示:
public static Foo Add(Foo fooA, Foo fooB)
{
var newVar = fooA.Var + fooB.Var
return new Foo(newVar);
}
我已经通过引用参数来测量它可以更快:
public static Foo Add(ref Foo fooA, ref Foo fooB)
{
var newVar = fooA.Var + fooB.Var;
return new Foo(newVar);
}
足够公平。但是如果我避免创建一个新实例而是修改了第一个参数,那么会让人感到困惑吗?
public static void Add(ref Foo fooA, ref Foo fooB)
{
fooA.Var += fooB.Var;
}
我无法像我想的那样雄辩地提出我的问题,但我希望能够理解它。
编辑: 或者,如果需要这样的东西,那么该方法首先不应该是静态的。这是正确的断言吗?
答案 0 :(得分:1)
这并不令人困惑,但你会得到不同的结果。在第二种情况下,你正在改变其中一个输入,也许你不希望这样。
这种行为称为Side effect,有时候真的很痛苦。这是使用函数式编程(较少的副作用)而不是命令式语言的一个很好的理由。
答案 1 :(得分:0)
你的第二个例子肯定会更快,因为.net框架不会复制你的参数,因为它们是“byval”。当需要所有类型的性能增益时,使用该技术。很明显,“byref”比“byval”更快。
你的方法可以是静态的,也可以是实例,如果你使用“ref”就没有内存的复制,在你的情况下,它是一个值类型的结构。