C#關鍵字:static

来源:https://www.cnblogs.com/yaojieyuan/archive/2019/09/10/11502412.html

一、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#第六版


您的分享是我們最大的動力!

更多相關文章
  • 在java的spring中有自動註入功能,使得代碼變得更加簡潔靈活,所以想把這個功能移植到c#中,接下來逐步分析實現過程 1.使用自動註入場景分析 在asp.net mvc中,無論是什麼代碼邏輯分層,最終的表現層為Controller層,所以我們註入點就是在Controller中,這裡我們需要替換默 ...
  • EF 6及以前的版本是預設支持延遲載入(Lazy Loading)的,早期的EF Core中並不支持,必須使用Include方法來支持導航屬性的數據載入。 當然在 EF Core 2.1 及之後版本中已經引入了延遲載入功能,詳細實現原理可以查看官網( "傳送門" )。 下麵記錄一下,分別使用Incl ...
  • 按照目前的軟體開發發展趨勢中,不管是前後端分離還是提供數據服務,WebApi使用的越來越廣泛,而且.NET Core也是我們.NET開發人員未來發展的趨勢,所以說學會使用.NET Core Api是非常有必要的。 本人作為一個.NET菜鳥,正在慢慢的學習中,將學到的一步一步記錄下來。 一、創建項目 ...
  • 官網地址:https://framework7.io/docs/autocomplete.html#autocomplete-parameters 效果圖: <meta charset="UTF-8"><meta name="viewport" content="width=device-width ...
  • Http請求資源的過程可以看成一個管道:“Pipe”,並不是所有的請求都是合法的、安全的,其於功能、性能或安全方面的考慮,通常需要在這管道中裝配一些處理程式來篩選和加工這些請求。這些處理程式就是中間件。 中間件之間的調用順序就是添加中間件組件的順序,調用順序以於應用程式的安全性、性能、和功能至關重要 ...
一周排行
  • 首先給大家介紹一下序列化是用來乾什麼的,他為什麼出現 序列化這種技術說到底其實就是把臨時數據保存在電腦上。大家都知道對於程式而言對象是一種稍縱即逝的數據,不僅僅是程式重啟、電腦重啟,就連內部函數的變化也有可能導致對象的消失,但是總有一些對象是大家不想讓其隨意消失的並且想在下一次開啟程式的時候進行載入 ...
  • 一、前言 在.Net Framework框架有專門獲取webconfig配置的方法供我們使用,但是在.Net Core或者.Net Standard中沒有可以直接使用的方法來獲取配置文件信息,下麵就來實現獲取配置信息。 二、獲取配置信息的實現 在.Net Core中,他的配置信息的載體是一個json ...
  • 你一定看過這篇文章 《進擊的 Java ,雲原生時代的蛻變》, 本篇文章的靈感來自於這篇文章。北京時間9.24 就將正式發佈.NET Core 3.0, 所以寫下這篇文章讓大家全面認識.NET Core。.NET 生態系統是一個不斷變化的生態圈,我相信它正在朝著一個偉大的方向發展。正好 最近 Inf... ...
  • 參考文檔:Dapper one to many Table C Code pulic List GetPersons(){ var sql = @"SELECT 1 AS Id, 'Daniel Dennett' AS Name, 1942 AS Born, 1 AS CountryId, 'Uni ...
  • 非標設備多相機流水線模式緩存圖片(C/S客戶端,c 開發語言) ​ 本文所說流水線方式下存儲圖像是在軟體測量周期慢於圖片周期前提下講解的,如果軟體一直在等待圖片數據,邏輯就沒有那麼複雜。 1、非標設備項目,常規模式測量流程 常規模式下,相機採集圖像信號由上位機控制(無論軟觸發、硬觸發)。每個周期內的 ...
  • 簡單創建.NET Core WebApi:https://www.cnblogs.com/yanbigfeg/p/9197375.html 登陸驗證四種方式:https://www.cnblogs.com/zuowj/p/5123943.html 解決跨域的8種方法:https://blog.csd ...
  • 最近有個需求就是網頁表格裡面的數據導出到excel 於是從各位前輩的博客園搜了搜demo 大部分非為兩類 都是用的插件NPOI和Eppluse ,因此在這裡就介紹Eppluse 用法,還有就是在博客的時候 好多有留言說想看從資料庫裡面的數據進行導入 而不是寫死的,所以我就以我的案例給大家分享下用法( ...
  • 表達式樹練習實踐:C 值類型、引用類型、泛型、集合、調用函數 [TOC] 一,定義變數 C 表達式樹中,定義一個變數,使用 。 創建變數結點的方法有兩種, 兩種方式都是生成 類型 和 都具有兩個重載。他們創建一個 ParameterExpression節點,該節點可用於標識表達式樹中的參數或變數。 ...
  • 就像是.NET Framework WebApi與.NET Core WebApi一樣,.NET Framework MVC與.NET Core MVC的區別,也是框架的之間的區別。本系列先首先從.NET Framework MVC介紹,後面再去介紹.NET Core MVC 狹義MVC: MVC是 ...
  • 緩存的實現 我們不是做第三方比如Redis等的緩存實現,而是根據實際情況,基於C#上做一些環境變數的保存,方便項目使用。 1、系統全局變數 很多時候,在系統運行開始,需要對系統的運行參數進行保存,以便供全局使用。 代碼如下: 這裡使用一個靜態變數的Dictionary來進行保存,所有項目均可以直接獲 ...
x