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

C# 静态方法应该修改对象还是返回新对象,c#,.net,oop,static,instance,C#,.net,Oop,Static,Instance,假设有一个8-16字节的结构Foo。它有一个静态方法将其所有值添加到另一个结构中,性能至关重要。我见过许多静态方法,如下面的一种: 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 foo

假设有一个8-16字节的结构
Foo
。它有一个静态方法将其所有值添加到另一个结构中,性能至关重要。我见过许多静态方法,如下面的一种:

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;
}
我还不能像我想的那样雄辩地阐述我的问题,但我希望大家能理解

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

这并不令人困惑,但你得到了不同的结果。在第二种情况下,您正在更改一个输入,可能您不希望这样


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

您的第二个示例肯定会更快,因为.net framework不会像使用“byval”时那样复制您的参数。当需要各种性能增益时,可使用此技术。很明显,“byref”比“byval”快


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

您是指第三种情况,对吗?第二个病例没有副作用。是的,对不起。我指的是第三种情况。这取决于你想做什么,但大多数时候修改你的参数是个坏主意。我知道什么是
ref
。第三种情况是最快的,因为我避免分配任何额外的内存。我想我的问题是:我应该让它保持静态,还是将它作为一个实例方法更好?这与对错无关。这完全取决于你的设计!!!我试图将我的设计建立在人们期望的基础上,而不是模糊的基础上,所以我在这里问这个问题。你的第三个例子很好。随着命名的进行,可能需要更加清晰。XML注释可以帮助客户机理解它的功能。但肯定的是,对于用户来说,示例1和2比示例3更清晰。我也这么认为。最后我将使用一个实例方法。