静态方法是应该修改对象还是返回新对象

时间:2013-08-05 13:37:41

标签: c# .net oop static instance

假设有一个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;
}

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

你的第二个例子肯定会更快,因为.net框架不会复制你的参数,因为它们是“byval”。当需要所有类型的性能增益时,使用该技术。很明显,“byref”比“byval”更快。

你的方法可以是静态的,也可以是实例,如果你使用“ref”就没有内存的复制,在你的情况下,它是一个值类型的结构。