程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 懂得C#編程中的靜態類和靜態成員和密封類

懂得C#編程中的靜態類和靜態成員和密封類

編輯:C#入門知識

懂得C#編程中的靜態類和靜態成員和密封類。本站提示廣大學習愛好者:(懂得C#編程中的靜態類和靜態成員和密封類)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得C#編程中的靜態類和靜態成員和密封類正文


靜態類
靜態類與非靜態類根本雷同,但存在一個差別:靜態類不克不及實例化。也就是說,不克不及應用 new 症結字創立靜態類類型的變量。由於沒有實例變量,所以要應用類名自己拜訪靜態類的成員。例如,假如名為 UtilityClass 的靜態類有一個名為 MethodA 的公共辦法,則按上面的示例所示挪用該辦法:

UtilityClass.MethodA();

關於只對輸出參數停止運算而不獲得或設置任何外部實例字段的辦法集,靜態類可以便利地用作這些辦法集的容器。例如,在 .NET Framework 類庫中,靜態類 System.Math 包括的辦法只履行數學運算,而無需存儲或檢索特定 Math 類實例獨有的數據。就是說,經由過程指定類稱號和辦法稱號來運用類成員,以下示例所述。

double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));

輸入:

3.14
-4
 3


和一切類類型一樣,當加載援用靜態類的法式時,.NET Framework 公共說話運轉時 (CLR) 將加載該靜態類的類型信息。法式不克不及指定加載靜態類切實其實切時光。然則,可以包管在法式中初次援用該類前加載該類,並初始化該類的字段並挪用其靜態結構函數。靜態結構函數僅挪用一次,在法式駐留的運用法式域的生計期內,靜態類一向保存在內存中。

靜態類的重要特征:

  • 僅包括靜態成員。
  • 沒法實例化。
  • 是密封的。
  • 不克不及包括實例結構函數。


是以,創立靜態類與創立僅包括靜態成員和公有結構函數的類根本雷同。公有結構函數阻攔類被實例化。應用靜態類的長處在於,編譯器可以或許履行檢討以確保不致有時地添加實例成員。編譯器將包管不會創立此類的實例。
靜態類是密封的,是以弗成被繼續。它們不克不及從除 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();
 }
}

輸入:

 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 對象援用。然則,二者之間的機能差別在年夜多半時刻其實不顯著。

C#的密封類
應用 sealed 症結字可以避免繼續之前標志為 virtual 的類或某些類成員。
經由過程在類界說後面放置症結字 sealed,可以將類聲明為密封類。例如:

public sealed class D
{
 // Class members here.
}

密封類不克不及用作基類。是以,它也不克不及是籠統類。密封類制止派生。因為密封類從不消作基類,所以有些運轉時優化可以稍微進步密封類成員的挪用速度。
在對基類的虛成員停止重寫的派生類上,辦法、索引器、屬性或事宜可以將該成員聲明為密封成員。在用於今後的派生類時,這將撤消成員的虛後果。辦法是在類成員聲明中將 sealed 症結字置於 override 症結字的後面。例如:

public class D : C
{
 public sealed override void DoWork() { }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved