最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

UtilityClass.MethodA();

對(duì)于只對(duì)輸入?yún)?shù)進(jìn)行運(yùn)算而不獲取或設(shè)置任何內(nèi)部實(shí)例字段的方法集,靜態(tài)類可以方便地用作這些方法集的容器。例如,在 .NET Framework 類庫(kù)中,靜態(tài)類 System.Math 包含的方法只執(zhí)行數(shù)學(xué)運(yùn)算,而無(wú)需存儲(chǔ)或檢索特定 Math 類實(shí)例特有的數(shù)據(jù)。就是說(shuō),通過(guò)指定類名稱和方法名稱來(lái)應(yīng)用類成員,如下示例所述。

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


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

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

  • 僅包含靜態(tài)成員。
  • 無(wú)法實(shí)例化。
  • 是密封的。
  • 不能包含實(shí)例構(gòu)造函數(shù)。


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

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

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)的方法、字段、屬性或事件。即使沒(méi)有創(chuàng)建類的實(shí)例,也可以調(diào)用該類中的靜態(tài)成員。始終通過(guò)類名而不是實(shí)例名稱訪問(wèn)靜態(tài)成員。無(wú)論對(duì)一個(gè)類創(chuàng)建多少個(gè)實(shí)例,它的靜態(tài)成員都只有一個(gè)副本。靜態(tài)方法和屬性不能訪問(wèn)其包含類型中的非靜態(tài)字段和事件,并且不能訪問(wèn)任何對(duì)象的實(shí)例變量(除非在方法參數(shù)中顯式傳遞)。
更常見(jiàn)的做法是聲明具有一些靜態(tài)成員的非靜態(tài)類,而不是將整個(gè)類聲明為靜態(tài)類。靜態(tài)字段有兩個(gè)常見(jiàn)的用法:一是記錄已實(shí)例化對(duì)象的個(gè)數(shù),二是存儲(chǔ)必須在所有實(shí)例之間共享的值。
靜態(tài)方法可以被重載但不能被重寫(xiě),因?yàn)樗鼈儗儆陬?,不屬于類的任何?shí)例。
雖然字段不能聲明為 static const,但 const 字段的行為在本質(zhì)上是靜態(tài)的。這樣的字段屬于類型,不屬于類型的實(shí)例。因此,可以同對(duì)待靜態(tài)字段一樣使用 ClassName.MemberName 表示法來(lái)訪問(wèn) const 字段。不需要對(duì)象實(shí)例。
C# 不支持靜態(tài)局部變量(在方法范圍內(nèi)聲明的變量)。
通過(guò)在成員的返回類型之前使用 static 關(guān)鍵字可以聲明靜態(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)成員在第一次被訪問(wèn)之前并且在調(diào)用靜態(tài)構(gòu)造函數(shù)(如有存在)之前進(jìn)行初始化。若要訪問(wèn)靜態(tài)類成員,應(yīng)使用類名而不是變量名來(lái)指定該成員的位置,如下面的示例所示:

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

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

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

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

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

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

相關(guān)文章

  • C#窗口實(shí)現(xiàn)單例模式的方法

    C#窗口實(shí)現(xiàn)單例模式的方法

    本文介紹了C#窗口實(shí)現(xiàn)單例模式的方法,對(duì)于一個(gè)軟件如果第二次打開(kāi)程序,就把已經(jīng)啟動(dòng)的那個(gè)進(jìn)程的窗口放到最前端顯示,需要了解的朋友可以參考下
    2015-07-07
  • C#自定義簡(jiǎn)化cookie類實(shí)例

    C#自定義簡(jiǎn)化cookie類實(shí)例

    這篇文章主要介紹了C#自定義簡(jiǎn)化cookie類,實(shí)例分析了C#操作cookie的添加、獲取及刪除等操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#基于正則表達(dá)式實(shí)現(xiàn)獲取網(wǎng)頁(yè)中所有信息的網(wǎng)頁(yè)抓取類實(shí)例

    C#基于正則表達(dá)式實(shí)現(xiàn)獲取網(wǎng)頁(yè)中所有信息的網(wǎng)頁(yè)抓取類實(shí)例

    這篇文章主要介紹了C#基于正則表達(dá)式實(shí)現(xiàn)獲取網(wǎng)頁(yè)中所有信息的網(wǎng)頁(yè)抓取類,結(jié)合完整實(shí)例形式分析了C#正則網(wǎng)頁(yè)抓取類與使用技巧,需要的朋友可以參考下
    2017-05-05
  • C#.Net基于正則表達(dá)式抓取百度百家文章列表的方法示例

    C#.Net基于正則表達(dá)式抓取百度百家文章列表的方法示例

    這篇文章主要介紹了C#.Net基于正則表達(dá)式抓取百度百家文章列表的方法,結(jié)合實(shí)例形式分析了C#獲取百度百家文章內(nèi)容及使用正則表達(dá)式匹配標(biāo)題、內(nèi)容、地址等相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • C# VTK 移動(dòng)旋轉(zhuǎn)交互功能實(shí)現(xiàn)

    C# VTK 移動(dòng)旋轉(zhuǎn)交互功能實(shí)現(xiàn)

    對(duì)vtk場(chǎng)景中一個(gè)或多個(gè)選中物體進(jìn)行移動(dòng)旋轉(zhuǎn),今天通過(guò)本文給大家分享C# VTK 移動(dòng)旋轉(zhuǎn)交互功能實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • C#?OpenCV實(shí)現(xiàn)形狀匹配的方法詳解

    C#?OpenCV實(shí)現(xiàn)形狀匹配的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#+OpenCV實(shí)現(xiàn)形狀匹配的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • C#判斷ip地址是否可以ping的通

    C#判斷ip地址是否可以ping的通

    這篇文章主要介紹了ip地址是否可以ping的通的方法,使用到了C#,需要的朋友可以參考下
    2014-06-06
  • 一篇文章看懂C#中的協(xié)變、逆變

    一篇文章看懂C#中的協(xié)變、逆變

    這篇文章主要給大家介紹了如何通過(guò)一篇文章看懂C#中協(xié)變、逆變的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • C#簡(jiǎn)單了解接口(Interface)使用方法

    C#簡(jiǎn)單了解接口(Interface)使用方法

    這篇文章主要介紹了C#簡(jiǎn)單了解接口(Interface)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • C#獲取兩個(gè)時(shí)間的時(shí)間差并去除周末(取工作日)的方法

    C#獲取兩個(gè)時(shí)間的時(shí)間差并去除周末(取工作日)的方法

    這篇文章主要介紹了C#獲取兩個(gè)時(shí)間的時(shí)間差并去除周末(取工作日)的方法,可有效的實(shí)現(xiàn)獲取工作日的功能,涉及C#時(shí)間操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

双辽市| 炉霍县| 扶沟县| 囊谦县| 宜城市| 井冈山市| 彭州市| 盱眙县| 江达县| 怀来县| 秦皇岛市| 东海县| 溧阳市| 新泰市| 罗定市| 汶上县| 上虞市| 彩票| 丘北县| 元氏县| 融水| 罗平县| 肃南| 玉树县| 武安市| 康乐县| 苗栗县| 蕉岭县| 宁海县| 南投县| 沂水县| 逊克县| 土默特左旗| 洛隆县| 宁海县| 西宁市| 邹城市| 蛟河市| 宝鸡市| 克山县| 山西省|