靜態變數和非靜態變數
在c裡面都是靜態.
在c#裡對於類裡面的任何非靜態成員,要用就必須有對象應用。
class A
{
static int a;
int b;
}
main
{
int i = 0;
A classA = new A();
//要用b就必須寫成
classA.b = i;
//要用a就必須寫成
A.a = i;
//看出來沒有,classA是對象,而A是類;
}
理論部分:
一.靜態變數和非靜態變數的基本概念
資料成員包括:靜態變數和非靜態變數兩種
A 靜態變數:帶有static 修飾符的變數稱為靜態變數。
B 非表態變數:不帶有static修飾符聲明的變數稱為執行個體變數。
二. 兩都的一些區別
class test
{
static int b=0; //靜態變數
int a=0; //非靜態變數
}
1.記憶體配置的區別:靜態變數定義時就會存在於記憶體當中,直到它所在的類的程式運行結束之時它都將一直存在;而非靜態變數需要被執行個體化後才會分配記憶體,它的存在周期取決於執行個體化的類的生存周期。
所以他們的調用方式也不相同:
靜態變數:可以(只能)通過類本身.靜態變數名,類的執行個體是不能調用的。
非靜態變數: 當該變數所在的類被執行個體化後,可以通過執行個體化的類名來訪問。
(另外靜態成員不能訪問非靜態成員;非靜態成員可以訪問靜態成員)
test.b=2; //OK
test t=new test();
t.a=0; //OK
t.b=3 ; //Error 編繹時會出錯 無法使用執行個體引用訪問靜態成員
2. 兩者值的共用問題: 靜態變數被所有類的執行個體對象共用,即一個執行個體的改變了靜態變數的值,其他同類的執行個體讀到的就是變化後的值。非靜態變數是不共用的。
ex:下面的最後的輸出結果是:10,0
class Class1
{
public static int cs1=0;
public int cs3=0;
}
class Class2
{
public void a()
{
Console.WriteLine(Class1.cs1.ToString());
// 因cs1是靜態變數,所以當類Program修改cs1=10後,其它類的執行個體讀到的值就是修改後的值10,所以此處輸出的是:10
Class1 cc = new Class1();
Console.WriteLine(cc.cs3.ToString());
//雖然類Program修改值cs3=34;但因cs3在class1類中是非靜態變數,它的生存周期於執行個體化他的類的周期相同,所以當用類名ct執行個體結束後其值也不會存在於記憶體當中,當此類用另一個類名cc來執行個體化後調用變數cs3,其值仍是非靜態變數初始化的值0.
}
}
class Program
{
static void Main(string[] args)
{
Class1.cs1 = 10;
Class1 ct = new Class1();
ct.cs3 = 34;
Class2 cm = new Class2();
cm.a();
}
}
類名.靜態變數名
執行個體化的名.非靜態變數名