静态方法与非静态方法

时间:2012-03-27 07:28:34

标签: c# static

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

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

提前致谢!

4 个答案:

答案 0 :(得分:3)

引用MSDN:

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

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

尽管如此,任何表现差异都可能微不足道(正如其他人所说)。如果您确定只有在拥有对象实例时才会调用该方法,那么将其设置为静态就没有意义。

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

答案 1 :(得分:2)

  

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

你不需要,它可能不会产生显着的性能差异,如果有的话。但是,您可能希望考虑无论如何都要这样做。如果这些方法因多态性原因而不是虚拟的,并且它们没有使用任何关于特定实例的内容,那么我会将它们静态化为 show 它们并不真正与任何特定实例绑定

答案 2 :(得分:0)

所有其他相同的非虚拟调用稍微快一点,因此转换为静态方法应该会产生性能提升。但是,静态方法具有根本不同的行为 - 特别是对于多线程代码 - 因此您应该仔细处理。

答案 3 :(得分:0)

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

Static methods即使没有method instanciating,也可以访问object。 请考虑以下代码段:

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


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

我的建议是,不要遵循这条消息,只是按照你的设计告诉你:)。 如果您认为require object的权利,请勿将其标记为static。如果您发现其一致而无法method调用此object,则标记为static