【发布时间】:2013-11-20 14:09:52
【问题描述】:
据我了解,静态的唯一目的是使方法能够在类本身上被调用,而不是在它的实例上调用。但是,如果该方法也是私有的,您将只能从类中调用它。那么,是否有理由将某些东西声明为私有和静态? ReSharper 建议我将我的许多方法设为静态,而我只是不明白私有方法的意义。
【问题讨论】:
据我了解,静态的唯一目的是使方法能够在类本身上被调用,而不是在它的实例上调用。但是,如果该方法也是私有的,您将只能从类中调用它。那么,是否有理由将某些东西声明为私有和静态? ReSharper 建议我将我的许多方法设为静态,而我只是不明白私有方法的意义。
【问题讨论】:
是的,如果您在类中有(public 或其他)static 方法,并且此方法需要使用您的 private 方法。如果不是static,那是行不通的。
public static void Foo1()
{
Foo2(); // compile time error
}
private void Foo2()
{
}
仅当方法需要使用非静态的字段或属性(以及继承等其他原因)时,它们才需要是实例方法。因此,最好将其设为静态。
【讨论】:
如果您的私有方法不使用任何实例方法或字段或属性,那么最好将其标记为静态。
这样做,您会在 IL 中得到call 操作码,在调用该方法之前不会执行任何“空值检查”。其中实例方法发出callvirt 操作码,它在调用方法之前执行“空检查”。这有助于您获得性能优势。
【讨论】:
性能。这是一个(微)优化。 CLR 需要执行更少的步骤来找到他需要执行的方法。
详细解释: http://msdn.microsoft.com/en-us/library/79b3xss3.aspx
对静态方法的调用会在 Microsoft 中生成调用指令 中间语言 (MSIL),而对实例方法的调用 生成一个 callvirt 指令,该指令还检查空对象 参考。但是,大多数时候性能差异 两者之间不显着。
【讨论】:
如果编写的方法不使用对象的状态并且是实现细节,您往往会看到这一点。你可以直接改成private,但有些人更喜欢改成static,以充分表明该方法不会触及状态。
我个人会选择private。
【讨论】: