欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類

 更新時間:2016年01月29日 15:22:53   投稿:goldensun  
這篇文章主要介紹了理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類,注意類成員的相關訪問限制和類的繼承問題,需要的朋友可以參考下

靜態(tài)類
靜態(tài)類與非靜態(tài)類基本相同,但存在一個區(qū)別:靜態(tài)類不能實例化。也就是說,不能使用 new 關鍵字創(chuàng)建靜態(tài)類類型的變量。因為沒有實例變量,所以要使用類名本身訪問靜態(tài)類的成員。例如,如果名為 UtilityClass 的靜態(tài)類有一個名為 MethodA 的公共方法,則按下面的示例所示調用該方法:

UtilityClass.MethodA();

對于只對輸入參數進行運算而不獲取或設置任何內部實例字段的方法集,靜態(tài)類可以方便地用作這些方法集的容器。例如,在 .NET Framework 類庫中,靜態(tài)類 System.Math 包含的方法只執(zhí)行數學運算,而無需存儲或檢索特定 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


和所有類類型一樣,當加載引用靜態(tài)類的程序時,.NET Framework 公共語言運行時 (CLR) 將加載該靜態(tài)類的類型信息。程序不能指定加載靜態(tài)類的確切時間。但是,可以保證在程序中首次引用該類前加載該類,并初始化該類的字段并調用其靜態(tài)構造函數。靜態(tài)構造函數僅調用一次,在程序駐留的應用程序域的生存期內,靜態(tài)類一直保留在內存中。

靜態(tài)類的主要特性:

  • 僅包含靜態(tài)成員。
  • 無法實例化。
  • 是密封的。
  • 不能包含實例構造函數。


因此,創(chuàng)建靜態(tài)類與創(chuàng)建僅包含靜態(tài)成員和私有構造函數的類基本相同。私有構造函數阻止類被實例化。使用靜態(tài)類的優(yōu)點在于,編譯器能夠執(zhí)行檢查以確保不致偶然地添加實例成員。編譯器將保證不會創(chuàng)建此類的實例。
靜態(tài)類是密封的,因此不可被繼承。它們不能從除 Object 外的任何類中繼承。靜態(tài)類不能包含實例構造函數,但可以包含靜態(tài)構造函數。如果非靜態(tài)類包含需要進行重要的初始化的靜態(tài)成員,也應定義靜態(tài)構造函數。

下面是一個靜態(tài)類的示例,它包含兩個在攝氏溫度和華氏溫度之間執(zhí)行來回轉換的方法:

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.

靜態(tài)成員
非靜態(tài)類可以包含靜態(tài)的方法、字段、屬性或事件。即使沒有創(chuàng)建類的實例,也可以調用該類中的靜態(tài)成員。始終通過類名而不是實例名稱訪問靜態(tài)成員。無論對一個類創(chuàng)建多少個實例,它的靜態(tài)成員都只有一個副本。靜態(tài)方法和屬性不能訪問其包含類型中的非靜態(tài)字段和事件,并且不能訪問任何對象的實例變量(除非在方法參數中顯式傳遞)。
更常見的做法是聲明具有一些靜態(tài)成員的非靜態(tài)類,而不是將整個類聲明為靜態(tài)類。靜態(tài)字段有兩個常見的用法:一是記錄已實例化對象的個數,二是存儲必須在所有實例之間共享的值。
靜態(tài)方法可以被重載但不能被重寫,因為它們屬于類,不屬于類的任何實例。
雖然字段不能聲明為 static const,但 const 字段的行為在本質上是靜態(tài)的。這樣的字段屬于類型,不屬于類型的實例。因此,可以同對待靜態(tài)字段一樣使用 ClassName.MemberName 表示法來訪問 const 字段。不需要對象實例。
C# 不支持靜態(tài)局部變量(在方法范圍內聲明的變量)。
通過在成員的返回類型之前使用 static 關鍵字可以聲明靜態(tài)類成員,如下面的示例所示:

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...
}

靜態(tài)成員在第一次被訪問之前并且在調用靜態(tài)構造函數(如有存在)之前進行初始化。若要訪問靜態(tài)類成員,應使用類名而不是變量名來指定該成員的位置,如下面的示例所示:

Automobile.Drive();
int i = Automobile.NumberOfWheels;

如果類包含靜態(tài)字段,請?zhí)峁┰诩虞d類時初始化這些字段的靜態(tài)構造函數。
對靜態(tài)方法的調用以 Microsoft 中間語言 (MSIL) 生成調用指令,而對實例方法的調用生成 callvirt 指令,該指令還檢查 null 對象引用。但是,兩者之間的性能差異在大多數時候并不明顯。

C#的密封類
使用 sealed 關鍵字可以防止繼承以前標記為 virtual 的類或某些類成員。
通過在類定義前面放置關鍵字 sealed,可以將類聲明為密封類。例如:

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

密封類不能用作基類。因此,它也不能是抽象類。密封類禁止派生。由于密封類從不用作基類,所以有些運行時優(yōu)化可以略微提高密封類成員的調用速度。
在對基類的虛成員進行重寫的派生類上,方法、索引器、屬性或事件可以將該成員聲明為密封成員。在用于以后的派生類時,這將取消成員的虛效果。方法是在類成員聲明中將 sealed 關鍵字置于 override 關鍵字的前面。例如:

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

相關文章

  • Unity實現瞄準鏡效果

    Unity實現瞄準鏡效果

    這篇文章主要為大家詳細介紹了Unity實現瞄準鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Unity封裝延時調用定時器

    Unity封裝延時調用定時器

    這篇文章主要為大家詳細介紹了Unity封裝延時調用定時器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#檢查遠程或本地磁盤使用率

    C#檢查遠程或本地磁盤使用率

    要檢查磁盤的使用情況確定程序放哪個服務器和清理垃圾,所以寫個小程序幫忙檢查。本文給大家介紹C#檢查遠程或本地磁盤使用率的相關知識,感興趣的朋友一起學習吧
    2016-04-04
  • C#刪除字符串中重復字符的方法

    C#刪除字符串中重復字符的方法

    這篇文章主要介紹了C#刪除字符串中重復字符的方法,涉及C#針對字符串的遍歷及移除等操作的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • C#實現多線程編程的簡單案例

    C#實現多線程編程的簡單案例

    這篇文章介紹了C#實現多線程編程的簡單案例,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#學習教程之Socket的簡單使用

    C#學習教程之Socket的簡單使用

    這篇文章主要給大家介紹了關于C#學習教程之Socket的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • C#WinForm實現多語言切換的示例

    C#WinForm實現多語言切換的示例

    本文主要介紹了C#WinForm實現多語言切換的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • C#多線程系列之讀寫鎖

    C#多線程系列之讀寫鎖

    本文詳細講解了C#多線程的讀寫鎖,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • c# 開發(fā)文字識別軟件

    c# 開發(fā)文字識別軟件

    這篇文章主要介紹了c# 開發(fā)文字識別軟件的方法,幫助大家更好的利用c#進行文字識別,感興趣的朋友可以了解下
    2020-12-12
  • c# 實現打印機狀態(tài)查詢與阻塞打印

    c# 實現打印機狀態(tài)查詢與阻塞打印

    這篇文章主要介紹了c# 引用System.Management來實現對打印機狀態(tài)的查詢,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-05-05

最新評論