您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C#中靜態變量與非靜態變量的區別有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C#中靜態變量與非靜態變量的區別有哪些”這篇文章吧。
靜態變量:靜態變量使用 static 修飾符進行聲明在所屬類被裝載時創建通過類進行訪問所屬類的所有實例的同一靜態變量都是同一個值非靜態變量:不帶有 static 修飾符聲明的變量稱做非靜態變量在類被實例化時創建通過對象進行訪問同一個類的不同實例的同一非靜態變量可以是不同的值。
對于自動變量,它屬于動態存儲方式。但是也可以用static定義它為靜態自動變量,或稱靜態局部變量,從而成為靜態存儲方式。由此看來,一個變量可由static進行再說明,并改變其原有的存儲方式。
下面介紹靜態變量與非靜態變量的區別如下:
1.內存分配
靜態變量在應用程序初始化時,就存在于內存當中,直到它所在的類的程序運行結束時才消亡;而非靜態變量需要被實例化后才會分配內存。
2.生存周期
靜態變量生存周期為應用程序的存在周期;非靜態變量的存在周期取決于實例化的類的存在周期。
3.調用方式
靜態變量只能通過“類.靜態變量名”調用,類的實例不能調用;非靜態變量當該變量所在的類被實例化后,可通過實例化的類名直接訪問。
4.共享方式
靜態變量是全局變量,被所有類的實例對象共享,即一個實例的改變了靜態變量的值,其他同類的實例讀到的就是變化后的值;
非靜態變量是局部變量,不共享的。
5.訪問方式
靜態成員不能訪問非靜態成員;非靜態成員可以訪問靜態成員。
靜態變量在類裝載的時候分配內存,以后創建的對象都使用的該內存,相應的操作也就是對這塊內存進行操作。也可以看作是另類的全局變量。
在WebSerivice中想只進行一次初始化,而不用每次都進行初始化這樣占用大量資源。還可以對調用的服務進行管理,比如想把每次調用的服務進行排隊執行,可以將想應信息放到Arraylist中,靜態時鐘中排隊執行。
C#靜態構造函數及靜態變量
靜態構造函數:
(1)用于對靜態字段、只讀字段等的初始化。
(2)添加static關鍵字,不能添加訪問修飾符,因為靜態構造函數都是私有的。
(3)類的靜態構造函數在給定應用程序域中至多執行一次:只有創建類的實例或者引用類的任何靜態成員才激發靜態構造函數
(4)靜態構造函數是不可繼承的,而且不能被直接調用。
(5)如果類中包含用來開始執行的 Main 方法,則該類的靜態構造函數將在調用 Main 方法之前執行。
(6)任何帶有初始值設定項的靜態字段,則在執行該類的靜態構造函數時,先要按照文本順序執行那些初始值設定項。
(7)如果沒有編寫靜態構造函數,而這時類中包含帶有初始值設定的靜態字段,那么編譯器會自動生成默認的靜態構造函數。
經典例子:
/* * 靜 態 構 造 函 數 練 習 * (1)①②③……為執行順序 * (2)輸出結果: static A() * static B() * X = 1, Y = 2 */ using System; class A { public static int X; static A() //④ 執行完后返回到③ { X = B.Y + 1; Console.WriteLine("static A()"); } } class B { public static int Y = A.X + 1; //③ 調用了A的靜態成員, // 轉到A的靜態構造函數----> static B() //② 如果帶有初始值設定項的靜態字段, // 執行該類的靜態構造函數時, // 先要按照文本順序執行那些初始值設定項。 // 轉到初始值設定項----> { Console.WriteLine("static B()"); } static void Main() //① 程序入口, // 如果類中包含用來開始執行的 Main 方法, // 該類的靜態構造函數將在調用 Main 方法之前執行。 // 轉到B的靜態構造函數----> { Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 輸出結果 Console.ReadLine(); } }
關于C#靜態構造函數的幾點說明:
靜態構造函數是C#的一個新特性,其實好像很少用到。不過當我們想初始化一些靜態變量的時候就需要用到它了。這個構造函數是屬于類的,而不是屬于哪里實例的,就是說這個構造函數只會被執行一次。也就是在創建***個實例或引用任何靜態成員之前,由.NET自動調用。
class SimpleClass { // Static constructor static SimpleClass() { // } }
在使用靜態構造函數的時候應該注意幾點:
1、靜態構造函數既沒有訪問修飾符,也沒有參數。因為是.NET調用的,所以像public和private等修飾符就沒有意義了。
2、是在創建***個類實例或任何靜態成員被引用時,.NET將自動調用靜態構造函數來初始化類,也就是說我們無法直接調用靜態構造函數,也就無法控制什么時候執行靜態構造函數了。
3、一個類只能有一個靜態構造函數。
4、無參數的構造函數可以與靜態構造函數共存。盡管參數列表相同,但一個屬于類,一個屬于實例,所以不會沖突。
5、最多只運行一次。
6、靜態構造函數不可以被繼承。
7、如果沒有寫靜態構造函數,而類中包含帶有初始值設定的靜態成員,那么編譯器會自動生成默認的靜態構造函數。
以上是“C#中靜態變量與非靜態變量的區別有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。