簡體   English   中英

靜態類有什么用?

[英]What is the use of a static class

靜態類有什么用? 我的意思是使用靜態類有什么好處以及CLR如何處理靜態類?

靜態類只表示您不期望或不需要實例 這對於實用程序邏輯很有用,其中代碼不是特定於對象的。 例如,擴展方法只能在靜態類中編寫。

在C#2.0之前,你可以擁有一個私有構造函數的常規類; 但是static使得它永遠不會有一個實例( 沒有構造函數*,並且所有成員必須是靜態的)。

(* =請參閱注釋鏈;您可以選擇使用類型初始值設定項(靜態構造函數,即.cctor ),但您不能擁有實例構造函數(也稱為.ctor ))。

.net的編譯和元數據模型要求所有函數都在類中定義。 這使得反射api的生活變得更容易和簡單,因為擁有類的概念及其可見性得到了很好的定義。 它還使il模型更簡單。

由於這排除了自由函數(不與類相關聯的函數),因此可以選擇放置沒有關聯狀態的函數的位置(因此需要一個實例)。 如果他們不需要與他們相關聯的狀態,也沒有任何明確的基於實例的類可以與之相關聯並因此在其中定義,那么他們的定義需要有一些成語。

以前最好的方法是在類中定義方法,這些方法的構造函數是私有的,並且類中沒有任何函數構造它。

這有點亂(因為它沒有說清楚為什么沒有注釋就完成了)並且反射api仍然可以找到構造函數並調用它。

因此,允許使用靜態類,使得用戶和類型系統明確了類的用途,即靜態方法定義的用途。 靜態類根本沒有構造函數。

靜態類是用C#編寫過程程序的語言hack。

靜態類的所有成員都必須是靜態成員,因此,如果您忘記在其中任何代碼之前添加'static',您的代碼將無法編譯,它也會使您的代碼更具可讀性,因為任何人都會看到該類是靜態的會理解它只包含靜態成員。

靜態類的最佳用途是實用程序函數,您也可以使用它們來保存應用程序中的全局方法和數據,我幾乎在任何項目中都經常使用靜態類。

靜態類通常用於對您最初不希望使用對象實例訪問的相關全局服務進行分組。 一個例子是.Net BCL中的Math類,您可以直接使用它,例如,Math.Sqrt(10.0)

我從這些陳述中得到了明確的想法。

要了解有關靜態類的更多信息。 首先,我們必須首先區分靜態數據和實例數據。

每次創建類的新實例時,都會獲得要使用的實例數據的新副本。 該類的實例方法適用於實例數據。 實例數據完全獨立於所有其他類中的實例數據,甚至是同一類的實例。 如果在一個實例中更改值,則對其他實例中的相同值沒有影響。 大量程序數據是實例數據。

靜態數據等同於全局數據。 程序中的每個人都看到相同的數據。 如果有人更改了數據,那么其他人也會看到更改。 靜態數據對於跨程序共享信息非常有用,例如數據庫連接字符串或日志文件。 一般來說,內存中只有一個靜態數據副本。 (例如處理多個appdomains時有例外)。

當您創建類的實例時,您實際上正在分配一些內存來保存您自己的類定義的實例數據副本。 如果您創建了一個類的5個實例,那么您將獲得5個單獨的內存位置,其中每個位置都有自己的實例數據副本。 每個內存塊獨立於其他內存塊。

如果一個類沒有實例數據,則創建它的實例沒有任何意義。 這樣做是無害的,但也浪費時間。 這就是靜態類的用武之地。 靜態類是一種將類標識為沒有實例數據的方法 通過將類標記為靜態,您告訴編譯器該類中的所有數據都是全面共享的 因此,編譯器會強制執行一些規則以使事情變得清晰。 靜態類只能包含靜態成員。 無法實例化靜態類。 必須密封靜態類。 為方便開發人員,編譯器強制執行此操作。

靜態類是密封的。 這是因為靜態類不能包含每個實例數據。

靜態方法是在類型級別上定義的,而不是在實例級別上定義的。 這就是為什么覆蓋不適用於靜態方法/屬性/事件...

靜態構造函數被調用一次,靜態類在程序所在的應用程序域的生命周期內保留在內存中。

靜態類是密封的。 對於實用程序類,這可能是一個有用的選項。

參考: http//msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

1.首先,你無法為靜態類創建實例

  1. 如果該類聲明為static,則該成員變量對於該類應該是靜態的

3.密封[無法繼承]

4.Cannot包含實例構造函數

5.記憶管理

示例:數學計算(數學值)不會更改[標准值的標准計算]

在一個類中,我們將一個函數聲明為static,只有當該函數沒有與任何對象相關聯時。 我們不應該在那個靜態函數中使用“this”運算符,因為“this”運算符將引用調用該函數的對象。 例如:考慮一個名為Employee的類,其中包含很少的變量,如Name,Age,Department,在這個Employee類中,我將添加一個名為getSimilarNames()的函數,該函數將顯示有多少具有相似名稱的員工。 此功能無需與任何員工關聯。 所以我將此函數聲明為Static.If是一個只包含靜態函數的類,我們聲明該類是一個靜態類。 靜態功能可提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM