一、static關鍵字 下麵我設計了一個房貸利率上浮類(用來計算房貸利率上浮多少): 上面例子的問題在於基準利率這個屬性是所有房貸利率上浮對象共用的屬性,而不是每個房貸利率上浮對象都擁有一個基準利率。所以要把基準利率這個屬性設置成共用的需要使用static關鍵字,第二版房貸利率上浮類: 靜態自動屬性 ...
一、static關鍵字
下麵我設計了一個房貸利率上浮類(用來計算房貸利率上浮多少):
1 public class InterestRateGoUp 2 { 3 public InterestRateGoUp() 4 { 5 Rate = 4.9m; 6 } 7 8 /// <summary> 9 /// 基準利率 10 /// </summary> 11 public decimal Rate { get; set; } 12 13 /// <summary> 14 /// 計算上浮 15 /// </summary> 16 /// <param name="rate">當前房貸利率</param> 17 /// <returns>返回利率上浮結果</returns> 18 public decimal CalculatorGoUp(decimal rate) 19 { 20 decimal result = (rate - Rate) / Rate; 21 return result; 22 } 23 } 24 public class RealizeObject 25 { 26 public Realize() 27 { 28 //小玄買房利率6.37 29 InterestRateGoUp rate1 = new InterestRateGoUp(); 30 float result1 = rate1.CalculatorGoUp(6.37m); 31 //小豆買房利率6.125 32 InterestRateGoUp rate2 = new InterestRateGoUp(); 33 float result2 = rate2.CalculatorGoUp(6.125m); 34 //房貸基準利率變成5.88,所有的對象的基準利率均需要改變 35 rate1.Rate = 5.88m; 36 rate2.Rate = 5.88m; 37 //如果有成百上千個這樣的對象,則要修改成百上千次 38 } 39 }
上面例子的問題在於基準利率這個屬性是所有房貸利率上浮對象共用的屬性,而不是每個房貸利率上浮對象都擁有一個基準利率。所以要把基準利率這個屬性設置成共用的需要使用static關鍵字,第二版房貸利率上浮類:
1 public class InterestRateGoUp 2 { 3 public InterestRateGoUp() 4 { 5 Rate = 4.9m; 6 } 7 8 /// <summary> 9 /// 基準利率 10 /// </summary> 11 public static decimal Rate { get; set; } 12 } 13 public class RealizeObject 14 { 15 public Realize() 16 { 17 //房貸基準利率變成5.88,只需要修改靜態屬性(所有的對象都使用它),靜態屬性的使用如下 18 InterestRateGoUp.Rate = 5.88m; 19 //使用構造函數初始化靜態屬性存在一個問題,就是每次創建對象都會初始化靜態屬性,如下會把基準利率修改為4.9 20 InterestRateGoUp rate3 = new InterestRateGoUp(); 21 } 22 }
靜態自動屬性的初始化方式有兩種,第一種是靜態自動屬性改為靜態屬性(靜態屬性封裝一個已賦值的靜態私有欄位),第二種是使用靜態構造函數,第三版房貸利率上浮類:
1 public class InterestRateGoUp 2 { 3 /// <summary> 4 /// 方法一:靜態屬性,而非靜態自動屬性 5 /// </summary> 6 private static decimal rate = 4.9m; 7 public static decimal Rate 8 { 9 get { return rate; } 10 set { rate = value; } 11 } 12 13 /// <summary> 14 /// 方法二:靜態構造函數 15 /// </summary> 16 static InterestRateGoUp() 17 { 18 Rate = 4.9m; 19 } 20 }
如果計算上浮的方法CalculatorGoUp經常被使用,可以把CalculatorGoUp設置成靜態的;如果整個房貸利率上浮類都是一個專門供用戶使用的工具類,則可以把類和類成員全部設置成靜態的。最終版房貸利率上浮類:
1 public static class InterestRateGoUp 2 { 3 static InterestRateGoUp() 4 { 5 Rate = 4.9m; 6 } 7 8 /// <summary> 9 /// 基準利率 10 /// </summary> 11 public static decimal Rate { get; set; } 12 13 /// <summary> 14 /// 計算上浮 15 /// </summary> 16 /// <param name="rate">當前房貸利率</param> 17 /// <returns>返回利率上浮結果</returns> 18 public static decimal CalculatorGoUp(decimal rate) 19 { 20 decimal result = (rate - Rate) / Rate; 21 return result; 22 } 23 } 24 public class RealizeObject 25 { 26 public Realize() 27 { 28 //小玄買房利率6.37 29 float result1 = InterestRateGoUp.CalculatorGoUp(6.37m); 30 //小豆買房利率6.125 31 float result2 = InterestRateGoUp.CalculatorGoUp(6.125m); 32 //房貸基準利率變成5.88 33 InterestRateGoUp.Rate = 5.88m; 34 //小傑買房利率5.88 35 float result3 = InterestRateGoUp.CalculatorGoUp(5.88m); 36 } 37 }
總結:
1、static關鍵字可以修飾在類和類型成員(欄位、屬性、方法、構造函數等)上。
2、static關鍵字修飾的內容只會創建一次並且只分配一次記憶體,在程式結束時才被回收(不占用GC性能)。static關鍵字修飾的類型成員是類級別上的(它是唯一的)而不是對象級別上的,所以使用靜態成員時只能通過(類名.靜態成員)而不能通過(對象名.靜態成員),靜態類也不能使用new創建其對象。
3、實例欄位/屬性是每個對象獨享的,每個對象都會為自己的每個實例數據分配記憶體空間,而靜態欄位/屬性是所有對象共用的,無論創建多少對象,靜態數據只分配一次。靜態方法適用於經常被使用的情況下,可以減少記憶體的分配和清理次數。類的實例欄位/屬性和實例方法不能在靜態方法中直接使用,只能通過(對象名.XXX)的方式使用。靜態構造函數專為靜態數據作初始化,其中它更適用於初始化在編譯時未知的靜態數據的值(如資料庫中讀取)。靜態類也稱為工具類,適用於整個類經常被使用,不能使用new創建它,並且只能包含用static修飾的類型成員。
備註:
1、靜態構造函數只能定義一個無參靜態構造函數,並且不允許有訪問修飾符;
2、無論創建了多少類型的對象,靜態構造函數只執行一次;
3、運行庫創建類實例或調用者首次訪問靜態成員之前,運行庫會調用靜態構造函數;
4、靜態構造函數的執行先於非靜態構造函數。
部分內容引用於精通C#第六版