c#静态和非静态方法之间的区别是什么?

What is the dIfference between c# static and non-static methods?

在这段代码中,静态函数和非静态函数有区别吗?

而且,除了静态函数属于对象而不属于实例之外,还有更多区别吗?

public class ClassName
{
   public void f1(SomeObject n)
   {
      n.someProperty = 1;
   }
   public static void f1(ref SomeObject n)
   {
      n.someProperty = 1;
   }
}

重复? 是的,看起来是这样。请注意,在另一个问题中没有解决问题本身的答案。

除了您已经提到的那些:不,没有区别。事实上,不真正影响(或不需要知道)同一对象的实例的函数,应该是首选静态的(这至少会减少对象的每个实例的内存占用) .

更新

现在想想,我认为它不会真正影响内存占用。所以选择看起来更好的,"design-wise"

只是补充一点,如果一个方法(如前所述)不需要对象的实例,"design-wise",它应该是静态的更好。如果有的话,因为您不必实例化对象即可使用它。

为什么 f1ClassName 相关联。你应该 extend SomeObject.

public static class SomeObjectExtensions
{
   public static void f1(this SomeObject o) { o.SomeProperty = 1; }
}

那么你的代码可以做到:

var so = new SomeObject();
so.f1();

仅根据您在您绝对应该使用的问题中发布的行来判断 静态版本,因为调用实例方法会降低性能:

1.) 后面调用实例方法涉及加载实例到评估是"this"参数,这是避免的 调用静态方法。

2.) 调用实例方法编译为 "Callvirt" IL 操作码,该操作码对 "this" 第一个传递的参数执行空检查,并且 然后尝试解析调用运行时的实际实例方法, 这适用于所有实例方法,不仅适用于虚拟方法 正如名字可能错误地暗示的那样。调用静态方法 另一方面将编译为 "call" IL 操作码,它将调用 方法。

3.) 静态方法本质上是无状态的,这使得多线程设计更容易(以防它们使用外部共享静态字段)。