靜態全域變數
定義:在全域變數前,加上關鍵字 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# 編程指南)。
因此建立靜態類與建立僅包含靜態成員和私人建構函式的類大致一樣。私人建構函式阻止類被執行個體化。
使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地添加執行個體成員。編譯器將保證不會建立此類的實利。
靜態類是密封的,因此不可被繼承。靜態類不能包含建構函式,但仍可聲明靜態建構函式以分配初始值或設定某個靜態狀態。