c#静态和非静态方法之间的差异是什么?

时间:2015-02-05 08:05:44

标签: c# overloading

在这段代码中,静态函数和非静态函数之间是否存在差异?

而且,除了静态函数属于对象而不属于实例之外,是否存在更多差异?

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

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

3 个答案:

答案 0 :(得分:5)

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

更新

现在我想起来了,我认为它确实不会影响内存占用。所以看看看起来更好,"设计明智"

只是添加,如果一个方法(如上所述)不需要对象的实例,"设计方式",它应该更好,因为静态。如果有的话,因为你不必实例化一个对象来使用它。

答案 1 :(得分:-1)

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

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

然后您的代码可以执行:

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

答案 2 :(得分:-1)

仅根据您在问题中发布的线条判断,您一定要使用 静态版本因为调用实例方法会导致性能损失:

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

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

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