標籤:style blog color 使用 strong 資料
靜態類與非靜態類基本相同,但存在一個區別:靜態類不能執行個體化。也就是說,不能使用 new 關鍵字建立靜態類類型的變數。因為沒有執行個體變數,所以要使用類名本身訪問靜態類的成員。
static class CompanyInfo{ public static string GetCompanyName() { return "CompanyName"; } public static string GetCompanyAddress() { return "CompanyAddress"; } //...}
和所有類類型一樣,當載入引用靜態類的程式時,.NET Framework 通用語言執行平台 (CLR) 將載入該靜態類的類型資訊。程式不能指定載入靜態類的確切時間。但是,可以保證在程式中首次引用該類前載入該類,並初始化該類的欄位並調用其靜態建構函式。靜態建構函式僅調用一次,在程式駐留的應用程式定義域的生存期內,靜態類一直保留在記憶體中。對於只對輸入參數進行運算而不擷取或設定任何內部執行個體欄位的方法集,靜態類可以方便地用作這些方法集的容器。例如,在 .NET Framework 類庫中,靜態類 System.Math 包含的一些方法只執行數學運算,而無需儲存或檢索特定 Math 類執行個體特有的資料。
靜態類的主要特性:僅包含靜態成員。無法執行個體化。是密封的。不能包含執行個體建構函式。建立靜態類(A)與建立僅包含靜態成員和私人建構函式的類(B)基本相同,私人建構函式阻止類被執行個體化。出現B這種情況易選用A。
使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地添加執行個體成員。編譯器將保證不會建立此類的實利。
靜態類是密封的,因此不可被繼承。它們不能從除 Object 外的任何類中繼承。靜態類不能包含執行個體建構函式,但可以包含靜態建構函式。如果非靜態類包含需要進行重要的初始化的靜態成員,也應定義靜態建構函式。
下面是一個靜態類的樣本,它包含兩個在攝氏溫度和華氏溫度之間執行來迴轉換的方法:public static class TemperatureConverter{ public static double CelsiusToFahrenheit(string temperatureCelsius) { // Convert argument to double for calculations. double celsius = Double.Parse(temperatureCelsius); // Convert Celsius to Fahrenheit. double fahrenheit = (celsius * 9 / 5) + 32; return fahrenheit; } public static double FahrenheitToCelsius(string temperatureFahrenheit) { // Convert argument to double for calculations. double fahrenheit = Double.Parse(temperatureFahrenheit); // Convert Fahrenheit to Celsius. double celsius = (fahrenheit - 32) * 5 / 9; return celsius; }}class TestTemperatureConverter{ static void Main() { Console.WriteLine("Please select the convertor direction"); Console.WriteLine("1. From Celsius to Fahrenheit."); Console.WriteLine("2. From Fahrenheit to Celsius."); Console.Write(":"); string selection = Console.ReadLine(); double F, C = 0; switch (selection) { case "1": Console.Write("Please enter the Celsius temperature: "); F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine()); Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F); break; case "2": Console.Write("Please enter the Fahrenheit temperature: "); C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine()); Console.WriteLine("Temperature in Celsius: {0:F2}", C); break; default: Console.WriteLine("Please select a convertor."); break; } // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); }}/* Example Output: Please select the convertor direction 1. From Celsius to Fahrenheit. 2. From Fahrenheit to Celsius. :2 Please enter the Fahrenheit temperature: 20 Temperature in Celsius: -6.67 Press any key to exit. */
靜態成員
非靜態類可以包含靜態方法、欄位、屬性或事件。即使沒有建立類的執行個體,也可以調用該類中的靜態成員。始終通過類名而不是執行個體名稱訪問靜態成員。
無論對一個類建立多少個執行個體,它的靜態成員都只有一個副本。
靜態方法和屬性不能訪問其包含類型中的非靜態欄位和事件,並且不能訪問任何對象的執行個體變數(除非在方法參數中顯式傳遞)。
更常見的做法是聲明具有一些靜態成員的非靜態類,而不是將整個類聲明為靜態類。靜態欄位有兩個常見的用法:一是記錄已執行個體化對象的個數,二是儲存必須在所有執行個體之間共用的值。
靜態方法可以被重載但不能被重寫,因為它們屬於類,不屬於類的任何執行個體。
雖然欄位不能聲明為 static const,但 const 欄位的行為在本質上是靜態。這樣的欄位屬於類型,不屬於類型的執行個體。因此,可以同對待靜態欄位一樣使用 ClassName.MemberName 標記法來訪問 const 欄位。不需要對象執行個體。
C# 不支援靜態局部變數(在方法範圍內聲明的變數)。
通過在成員的傳回型別之前使用 static 關鍵字可以聲明靜態類成員,如下面的樣本
public class Automobile{ public static int NumberOfWheels = 4; public static int SizeOfGasTank { get { return 15; } } public static void Drive() { } public static event EventType RunOutOfGas; // Other non-static fields and properties...}
靜態成員在第一次被訪問之前並且在調用靜態建構函式(如有存在)之前進行初始化。若要訪問靜態類成員,應使用類名而不是變數名來指定該成員的位置,如下面的樣本所示:
Automobile.Drive();
int i = Automobile.NumberOfWheels;
如果類包含靜態欄位,請提供在載入類時初始化這些欄位的靜態建構函式。
對靜態方法的調用以 Microsoft 中繼語言 (MSIL) 產生調用指令,而對執行個體方法的調用產生 callvirt 指令,該指令還檢查 null 對象引用。但是,兩者之間的效能差異在大多數時候並不明顯。
靜態類在記憶體中是一直有位置的;
2:非靜態類在執行個體化後是在記憶體中是獨立的,它的變數不會重複,在使用後會及時銷毀,所以不會出現未知
的錯誤。在C#中靜態成員是比較敏感的東西,在不是十分確認的情況下不要使用;
3:建議更多地使用一般類(非靜態類)。