【问题标题】:Static Methods Vs Non-Static Methods [duplicate]静态方法与非静态方法 [重复]
【发布时间】:2012-03-27 07:28:34
【问题描述】:

我正在开发一个 Web 应用程序,并创建了一个返回 Dataset 的方法。 在检查应用程序的性能时,我收到了如下消息 "不访问实例数据或调用实例方法的方法可以标记为静态

我不知道为什么我需要这样做。

提前致谢!

【问题讨论】:

  • 只给我发代码。如果我们看代码,这个问题似乎很简单。
  • Neither use static connections 也不是静态数据集,尤其是在 Web 应用程序中。
  • @TimSchmelter 这是在谈论静态方法,而不是静态字段。
  • @sq33G:我之所以发表评论,是因为不清楚 OP 是仅使用静态方法作为工厂还是使用/初始化静态字段。

标签: c# static


【解决方案1】:

引用 MSDN:

“将方法标记为静态后,编译器将向这些成员发出非虚拟调用站点。发出非虚拟调用站点将阻止在运行时检查每个调用以确保当前对象指针是非null。这可以为性能敏感的代码带来可衡量的性能提升。"

http://msdn.microsoft.com/en-us/library/ms245046.aspx

也就是说,任何性能差异都可能可以忽略不计(正如其他人所提到的)。如果您确定只有当您拥有对象的实例时才会调用该方法,那么将其设为静态是没有意义的。

虽然这不是规则的意图,但当我看到这个警告(来自代码分析或 Resharper)时,我确保它警告我的方法确实是它所属的地方。有时,一个方法没有引用类中的任何内容这一事实可能表明它确实不属于该类。

【讨论】:

  • +1 用于检查该方法是否会更好地放在其他地方
【解决方案2】:

我不知道为什么我需要这样做。

您不需要,而且它可能不会产生显着的性能差异(如果有的话)。但是,您可能希望考虑 这样做。如果这些方法由于多态性原因不是虚拟的,并且它们没有使用任何关于特定实例的东西,那么我会将它们设为静态以 显示 它们并没有真正绑定到任何特定实例.

【讨论】:

  • 是的,但从设计的角度来看,在没有相应实例的情况下调用这些方法可能是不正确的!你可能有一些逻辑与这些对象的创建有关,所以如果你将一些方法标记为静态,你就失去了所有这些。
  • @squelos:不清楚您所说的“与创建这些对象相关的逻辑”是什么意思 - 但我认为如果构造实例是制作静态方法的唯一方法 没有触及任何实例数据有效,设计肯定有问题。
【解决方案3】:

在所有其他条件相同的情况下,非虚拟调用会稍微快一些,因此转换为静态方法应该会产生性能提升。但是,静态方法具有根本不同的行为 - 尤其是在多线程代码方面 - 因此您应该谨慎处理。

【讨论】:

  • 当涉及到多线程代码时,您认为他们的“根本不同的行为”是什么?通常,您尝试使静态方法成为线程安全的,而实例方法通常不需要是线程安全的,但这是实现的问题 - 而不是它们的基本行为问题。将静态方法更改为实例方法不会改变它的线程安全程度,反之亦然。 (诚​​然,如果您使用属性进行同步,则会有所不同,但这是一种极端情况。)
  • 你是对的 - 我不应该链接我想我的意思是两者之间存在根本区别,因为一个对特定类型的实例进行操作,而另一个则没有。区别
  • 对,这绝对是要关注的区别。现在,我们有一个方法被标识为不访问与特定实例有关的任何内容...听起来它非常适合作为静态方法。
【解决方案4】:

您不一定需要这样做。实际上,在我看来,这是非常愚蠢的建议,因为它鼓励您将其标记为 static,而您可能不希望它是静态的!

Static methods 只需让 method 可以访问,即使没有 instanciatingobject。 考虑以下 sn-p :

Foo _bar = new Foo();
_bar.RandomMethod();// not necessarily static


Foo.RandomMethod();//Foo is the class, and RandomMethod is static. 

我的建议是,不要遵循该信息,而是按照您的设计告诉您:)。 如果您认为requireobject 是正确的,请不要将其标记为static。如果您发现可以在没有object 的情况下调用此method,标记为static

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多