Ner*_*ury 197 c# performance
在创建具有内部私有方法的类时,通常为了减少代码重复,不需要使用任何实例字段,将方法声明为静态是否具有性能或内存优势?
例:
foreach (XmlElement element in xmlDoc.DocumentElement.SelectNodes("sample"))
{
string first = GetInnerXml(element, ".//first");
string second = GetInnerXml(element, ".//second");
string third = GetInnerXml(element, ".//third");
}
Run Code Online (Sandbox Code Playgroud)
...
private static string GetInnerXml(XmlElement element, string nodeName)
{
return GetInnerXml(element, nodeName, null);
}
private static string GetInnerXml(XmlElement element, string nodeName, string defaultValue)
{
XmlNode node = element.SelectSingleNode(nodeName);
return node == null ? defaultValue : node.InnerXml;
}
Run Code Online (Sandbox Code Playgroud)
将GetInnerXml()方法声明为静态是否有任何优势?没有意见回复,我有意见.
Sco*_*man 211
从FxCop规则页面上:
将方法标记为静态后,编译器将向这些成员发出非虚拟调用站点.发出非虚拟调用站点将阻止在运行时检查每个调用,以确保当前对象指针为非null.这可以为性能敏感的代码带来可测量的性能提升.在某些情况下,无法访问当前对象实例表示正确性问题.
Nei*_*eil 89
当我写一堂课时,大多数方法分为两类:
静态方法很有用,因为只要查看它的签名,就会知道调用它不会使用或修改当前实例的状态.
举个例子:
public class Library { private static Book findBook(List<Book> books, string title) { // code goes here } }
如果一个库状态的实例变得搞砸了,而我正在试图弄清楚为什么,我可以排除findBook作为罪魁祸首,只是从它的签名.
我尝试使用方法或函数的签名尽可能多地进行通信,这是一种很好的方法.
Mar*_*kac 80
对静态方法的调用会生成Microsoft中间语言(MSIL)中的调用指令,而对实例方法的调用会生成callvirt指令,该指令还会检查空对象引用.但是,大多数时候两者之间的性能差异并不显着.
src:MSDN - http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.110).aspx
Ken*_*art 15
是的,编译器不需要将隐式this
指针传递给static
方法.即使您不在实例方法中使用它,它仍然被传递.
这迫使您记住还将函数使用的任何类范围成员声明为静态,这应该节省为每个实例创建这些项目的内存。