靜態與非靜態的區別
- 在非靜態類別中,既可以有實體成員(實例成員),也可以有靜態成員。
- 在調用實體成員的時候,需要使用對象名.實例成員;
在調用靜態成員的時候,需要使用「類別名.靜態成員名」
非靜態類別中,既可以有實例成員,也可以有靜態成員
1
2
3
4
5
6
7
public class Person
{
private int num; //實體成員(實例成員)
public static int count; //靜態成員
public void M1() {...} //非靜態方法(實體方法)
public static void M2() {...} //靜態方法
}
調用實體成員,靜態成員
- 使用實體成員:需要new實體化。物件名.實體成員
- 使用靜態成員:不需要new,直接使用。類別名.靜態成員名
1
2
3
4
5
6
//調用實體成員的時候,需要使用物件名.實體成員
Person p = new Person();
p.M1(); //非靜態方法
//在調用靜態成員的時候,需要使用類別名.靜態成員名
Person.M2(); //靜態方法
實例函數中,既可以使用靜態成員,也可以使用實例成員
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person
{
private int num; //實體成員
public static int count; //靜態成員
public void M1() {
Console.WriteLine("M1()我是非靜態方法");
}
public static void M2() {
Console.WriteLine("M2()我是靜態方法");
}
}
靜態函數中,只能訪問靜態成員,不允許訪問實例成員
1
2
3
4
5
6
7
8
9
public static class Person
{
//非靜態成員
private int num; //報錯
public void M1() {..}//報錯
public static int count;
public static void M2() {...}
}
不能在靜態類別中聲明實體成員
總結
- 靜態成員必須使用類別名去調用,而實例成員(實體成員)使用對象名(物件名)調用。
- 靜態函數中,只能訪問靜態成員,不允許訪問實體成員。
- 實例函數中,既可以使用靜態成員,也可以使用實體成員。
- 靜態類別中,只允許有靜態成員,不允許出現實體成員。
R Note
什麼時候用靜態類別?
使用:
- 如果你想要你的類別當做一個”工具”去使用(經常使用),就可以考慮使用靜態類別。
- 靜態類別在整個專案中資源共享。
靜態類別在專案中儘量不要太多,因為它會消耗你的資源
- 靜態類別是佔內存。(程式一開始就載入內存)
- 類別是不佔內存,實體是佔內存。(new實體化後才會佔內存)
實體 = 實例, 物件 = 對象, 記憶體 = 內存
物件實體方法與靜態方法的疑問
在設計類別時,如果會有需要讓用戶端(呼叫它的程式)直接使用而不必產生物件實體的話,可以把它設計為 static. static 也可以用來提供全域性(Global)的成員,包含變數,常數或函式 . 但它的缺點是在程式一開始就載進記憶體,直到程式終止,過多的靜態成員會佔住很多的記憶體 .
如果你要讓類別必須在做一些事情(初始化,載入資料)才能給用戶端取用時,就不必設計為 static. 這樣它就只會在載入時才會佔用記憶體,並且會在類別被終止(設定物件變數為 null 或是呼叫自己的摧毀物件方法,例如 Dispose())時會釋放出記憶體,缺點就是要呼叫前都要建立物件實體 .