C#中的static靜態變數的用法
靜態全域性變數
定義:在全域性變數前,加上關鍵字 static
該變數就被定義成為了一個靜態全域性變數。
特點:
A、該變數在全域性資料區分配記憶體。
B、初始化:如果不顯式初始化,那麼將被隱式初始化為0。
靜態區域性變數
定義:在區域性變數前加上static
關鍵字時,就定義了靜態區域性變數。
特點:
A、該變數在全域性資料區分配記憶體。
B、初始化:如果不顯式初始化,那麼將被隱式初始化為0。
C、它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。
靜態資料成員
特點:
A、記憶體分配:在程式的全域性資料區分配。
B、初始化和定義:
a、靜態資料成員定義時要分配空間,所以不能在類宣告中定義。
b、為了避免在多個使用該類的原始檔中,對其重複定義,所以,不能在類的標頭檔案中定義。
c、靜態資料成員因為程式一開始執行就必需存在,所以其初始化的最佳位置在類的內部實現。
C、特點
a、對相於 public,protected,private
b、因為其空間在全域性資料區分配,屬於所有本類的物件共享,所以,它不屬於特定的類物件,在沒產生類物件時其作用域就可見,即在沒有產生類的例項時,我們就可以操作它。
D、訪問形式
a、 類物件名.靜態資料成員名
E、靜態資料成員,主要用在類的所有例項都擁有的屬性上。比如,對於一個存款類,帳號相對於每個例項都是不同的,但每個例項的利息是相同的。所以,應該把利息設為存款類的靜態資料成員。這有兩個好處,第一,不管定義多少個存款類物件,利息資料成員都共享分配在全域性區的記憶體,所以節省存貯空間。第二,一旦利息需要改變時,只要改變一次,則所有存款類物件的利息全改變過來了,因為它們實際上是共用一個東西。
靜態成員函式
特點:
A、靜態成員函式與類相聯絡,不與類的物件相聯絡。
B、靜態成員函式不能訪問非靜態資料成員。原因很簡單,非靜態資料成員屬於特定的類例項。
作用:
主要用於對靜態資料成員的操作。
呼叫形式:
類物件名.靜態成員函式名()
static靜態變數的例項與分析
class class1
{
static int i = getNum();
int j = getNum();
static int num = 1;
static int getNum()
{
return num;
}
static void Main(string[] args)
{
Console.WriteLine("i={0}",i);
Console.WriteLine("j={0}", new class1().j);
Console.Read();
}
}
分析:Console.WriteLine("i={0}",i);
這裡i
是static
變數,而且類class1
是第一次被引 用,要先為class1
裡面所有的static
變數分配記憶體。儘管現在有超執行緒技術,但是指令在邏輯還是一條一條的按順序執行的,所以先為static int i
分配記憶體,並且在該記憶體中保持int
的預設值0
,接著再為static int num
變數分配記憶體,值當然也為0
。
然後執行第二步,為變數賦值:先為static int i
變數賦值,i=getNum()
,看getNum
裡面的程式碼,就是return num
,這個時候num
的值是0
,於是i
就為0
了。然後對變數num
賦值,num=1;
這行程式碼執行後,num
就為1
了。
所以最後的結果為:
i=0 j=1
當以一次引用類的時候,會對類中的靜態變數先按順序進行分配記憶體空間,當全部分配完記憶體空間之後,在對靜態變數按順序賦值。
static的優點是什麼?為什麼要使用static 變數或函式??
有一些頻繁使用的東西,如果你每次使用都重新new
一下,那麼這個開銷可能會很高,如果使用static
,一直放在記憶體中,那麼想用就直接用,而不需要重新new
一塊空間初始化資料。那麼static
就是為了實現一個系統的快取作用的,其生命週期直到應用程式退出結束。
靜態成員包括靜態欄位和靜態屬性,靜態成員和類相關聯,不依賴於物件而存在,只能由類訪問,而不能由物件訪問;
靜態成員屬於類所有,無認建立多少例項物件,靜態成員在記憶體中只有一份;例項成員屬於類的例項所有,每建立一個例項物件,例項成員都會在記憶體中分配一塊記憶體區域。
所以靜態成員一般用於存放共享的資料段,如資料庫連線字串等。
一個類如果只包含靜態成員和靜態方法,則該類可以定義為靜態類,給類加上static
修飾符;
靜態方法和非靜態方法:
一、效能上:靜態方法和例項方法差別不大。所有方法,不管是靜態方法還是例項方法,都是在JIT載入類時分配記憶體,不同的是靜態方法以類名引用,而例項方法對物件例項引用。建立例項時,不會再為類的方法分配記憶體,所有的例項物件共用一個類的方法程式碼。因此靜態方法和例項方法的呼叫,在效能上的差別微乎其微。
二、靜態方法只能由類訪問;例項方法只能由物件訪問。
優點:
1,靜態變數在類載入時,就裝入記憶體
2,使用時不用 New 就意味的不必 建立類中 所有物件,就可以呼叫 某個方法缺點:
1,垃圾回收機制 不能 回收 靜態變數,靜態類變數 會常駐記憶體
c#中靜態類的優缺點
缺點:
1、整個型別在程式執行期間只加載一次。 這樣是對於那些經常使用的型別來說的,那就不用每次使用前都先載入。效率高些。但是對那些不常用的型別來說。
2、如果是靜態型別,那就要一直佔用相當的記憶體;一直到程式停止。或者應用程式域被解除安裝。所以應該只對那些常用的型別定義成靜態型別。
優點:
1、它們僅包含靜態成員。
2、它們不能被例項化。
3、它們是密封的。
4、它們不能包含例項建構函式(C# 程式設計指南)。
因此建立靜態類與建立僅包含靜態成員和私有建構函式的類大致一樣。私有建構函式阻止類被例項化。
使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地新增例項成員。編譯器將保證不會建立此類的實利。
靜態類是密封的,因此不可被繼承。靜態類不能包含建構函式,但仍可宣告靜態建構函式以分配初始值或設定某個靜態狀態。