【转自】http://www.rainsts.net/article.asp?id=261
在论坛上经常看到一些莫名其妙的论点,其中有关静态方法的就很多。
1. 静态方法效率比实例方法高……
2. 静态方法比实例方法占内存,只有当类型被释放时才被回收……
3. 多个线程同时调用静态方法时,返回结果可能不准确……
……
说 实话,我很奇怪为什么会有这样的观点。首先,无论是静态方法还是实例方法都是通过类型方法表来查找,然后再去执行的,每次调用都会创建新的临时堆栈,只要 调用代码相同,怎么可能有效率高低之分?如第1种说法,可能是将对象实例化的时间也算进去了。而第2种说法,如果将静态方法换成静态字段就正确了。无论是 静态方法还是实例方法,当调用结束后,其内部临时变量都会失去引用,自然会被GC在合适的时间回收。如果要等类型释放才被回收,那麻烦就大了,因为类型只 有在应用程序域被卸载或者程序关闭时才会被"释放",如此下去,程序还能不出问题?至于第3种说法,我们用一个小例子验证一下。
{
static void Test()
{
Console.WriteLine(Thread.CurrentThread.Name + " start...");
Thread.Sleep(10000);
Console.WriteLine(Thread.CurrentThread.Name + " end...");
}
static void Main(string[] args)
{
Thread t1 = new Thread(delegate() { Test(); });
Thread t2 = new Thread(delegate() { Test(); });
t1.Name = "t1";
t2.Name = "t2";
t1.Start();
t2.Start();
}
}
输出:
t1 start...
t2 start...
t1 end...
t2 end...
通过这个例子,我们要明白,每个线程在执行静态方法的时候会创建独立的执行环境,内存中会有多个静态方法"实例"在同时执行。因此只要方法中不涉及共享数据,是不会出现结果出问题这么一说的。
很多初学者,习惯于将所有的方法都写成静态方法,理由是调用简单,想来是对OO思想了解不透的缘故。一般情况下,我们可以遵循以下几个简单的原则。
1. 当方法不需要保存状态,不需要调用外界变量(非方法参数)时,适合用静态方法。
2. 当类型中的方法是一些"互不相干"的帮助型(Helper)方法时,适合使用 static class / static method。