2

假设有一个Foo8-16 字节的结构。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;
}

我无法像我想要的那样雄辩地提出我的问题,但我希望它会被理解。

编辑:或者,如果需要这样的东西,该方法首先不应该是静态的。这是一个正确的断言吗?

4

2 回答 2

1

这并不令人困惑,但您会得到不同的结果。在第二种情况下,您正在更改其中一个输入,也许您不希望这样做。

这种行为被称为副作用,有时是一种真正的痛苦。这是使用函数式编程(较少副作用)而不是命令式语言的一个很好的理由。

于 2013-08-05T13:47:08.463 回答
0

您的第二个示例肯定会更快,因为.net 框架不会像“byval”那样复制您的参数。当需要所有类型的性能提升时,会使用此技术。很明显,“byref”比“byval”快。

您的方法可以是静态或实例,如果您使用“ref”,则不会复制内存,并且在您的情况下,它是一个值类型的结构。

于 2013-08-05T13:57:38.880 回答