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



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

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

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

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

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

更新

现在我想起来,我不认为它真的会影响内存占用。因此,选择看起来更好的"设计明智"

只是补充说,如果一个方法(如前所述)不需要对象的实例,"设计明智",那么它应该是静态的。如果有什么不同的话,因为你不必实例化一个对象就可以使用它。

为什么f1ClassName关联。您应该扩展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"第一个传递的参数执行null检查然后尝试解析调用运行时实际实例方法,这适用于所有实例方法,而不仅仅适用于虚拟实例方法正如这个名字可能错误地暗示的那样。在上调用静态方法另一只手将编译为"调用"IL操作码,该操作码将只调用方法。

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

最新更新