经常在编程中用到静态和非静态的方法,但从没有仔细考虑过究竟在什么场合下应该怎么使用,今天在这里记下几点心得:
1. 静态方法不会阻塞并发请求,以前一直有种感觉觉得静态方法是不是在同一时间点只能有一个线程调用,经测试这纯属幻觉!
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(StaticMethod));
Thread t2 = new Thread(new ThreadStart(StaticMethod));
t1.Name = "t1";
t2.Name = "t2";
t1.Start();
t2.Start();
Console.Read();
}
public static void StaticMethod()
{
Console.WriteLine(Thread.CurrentThread.Name + " -> StaticMethod starting...");
Thread.Sleep(2000);
Console.WriteLine(Thread.CurrentThread.Name + " -> StaticMethod ending...");
}
{
Thread t1 = new Thread(new ThreadStart(StaticMethod));
Thread t2 = new Thread(new ThreadStart(StaticMethod));
t1.Name = "t1";
t2.Name = "t2";
t1.Start();
t2.Start();
Console.Read();
}
public static void StaticMethod()
{
Console.WriteLine(Thread.CurrentThread.Name + " -> StaticMethod starting...");
Thread.Sleep(2000);
Console.WriteLine(Thread.CurrentThread.Name + " -> StaticMethod ending...");
}
2. 静态方法并不存在常驻内存,性能高等特点。方法跟属性不一样,方法在调用时都需要从代码区域获取一份本方法的代码去执行,在这一点上静态和非静态方法没有本质区别。在AppDomain加载程序集时,代码被放到特定的只读区域,不存在静态非静态之分。
3. 静态方法不能访问实例的方法,属性等,但实例方法则无此限制。同时需注意在多线程编程中,任何方法(包括静态和非静态)对本方法外定义的属性,变量等的访问和修改需谨慎,因为这可能导致线程安全问题。
4. 静态方法不能被继承,重写,因为static修饰符不能跟virtual, abstract, override等共存,因此在一些面向对象的设计中要谨慎使用,它在一定程度上的确会破坏面向对象设计OO特性,诸如继承,多态等。 但对于一些功能相对独立,不需要跟其它对象有很多调用,又不需要经常修改的方法,可以使用静态方法,静态方法在调用时相对简单明了。