對類的内部資料成員和函數成員都可以用static修飾。
如果成員被static修飾,那該成員就是靜态的,從應用角度講,類的使用者通過類來通路靜态成員在語義上更能夠被了解,而通過執行個體來通路靜态成員在語義上顯得不合适。
在類的内部,所有成員都可以通路靜态成員。但反過來,靜态成員絕對不可以通路執行個體成員。
靜态成員的值對于所有執行個體對象而言,是共享的,是以任何執行個體都可以通路或修改靜态成員,且更改的結果也同樣影響所有執行個體的通路。
1

public class Space
2
{
3
4
public static void Main(string[] args)
5
6
System.Console.WriteLine(new Order().CreateNumber());//725-1
7
System.Console.WriteLine(new Order().CreateNumber());//725-2
8
}
9
10
11

12

13

14

15

public class Order
16
17
18
private static int Count;// 該Count能被所有的執行個體通路
19
public string Number;
20
21
public string CreateNumber()
22
23
24
Count++;
25
return System.DateTime.Now.ToString("yMd-") + Count.ToString();
26
27
28
上面的代碼中,Count就是一個靜态成員,可以被所有的執行個體通路,且資料共享。
不過,在上述代碼中,CreateNumber的方法作為執行個體方法其實有點不妥,是以最好改為靜态方法。

System.Console.WriteLine(Order.CreateNumber());//725-1
System.Console.WriteLine(Order.CreateNumber());//725-2


public static string CreateNumber()
注意上面代碼中第6、7行對于CreateNumber的調用。
static方法的運用,很多在于語義領會。比如CreateNumber如果是執行個體方法的話,就會出現以下不合理的代碼。

Order order1 = new Order();

Order ordre2 = new Order();

ordre2.Number = order1.CreateNumber();//雖然編譯通過,但語義上也太離奇了吧

System.Console.WriteLine(ordre2.Number);
是以當CreateNumber是靜态的時候,下面的代碼更明确的告訴我們正常的語義



ordre2.Number = Order.CreateNumber();//Number由Ordr總控配置設定

本文轉自shyleoking 51CTO部落格,原文連結:http://blog.51cto.com/shyleoking/806294