亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中構造函數和析構函數用法實例詳解

2020-01-24 01:05:21
字體:
來源:轉載
供稿:網友

本文實例講述了C#中構造函數和析構函數用法。分享給大家供大家參考,具體如下:

構造函數與析構函數是一個類中看似較為簡單的兩類函數,但在實際運用過程中總會出現一些意想不到的運行錯誤。本文將較系統的介紹構造函數與析構函數的原理及在C#中的運用,以及在使用過程中需要注意的若干事項。

一.構造函數與析構函數的原理

作為比C更先進的語言,C#提供了更好的機制來增強程序的安全性。C#編譯器具有嚴格的類型安全檢查功能,它幾乎能找出程序中所有的語法問題,這的確幫了程序員的大忙。但是程序通過了編譯檢查并不表示錯誤已經不存在了,在“錯誤”的大家庭里,“語法錯誤”的地位只能算是冰山一角。級別高的錯誤通常隱藏得很深,不容易發現。

根據經驗,不少難以察覺的程序錯誤是由于變量沒有被正確初始化或清除造成的,而初始化和清除工作很容易被人遺忘。微軟利用面向對象的概念在設計C#語言時充分考慮了這個問題并很好地予以解決:把對象的初始化工作放在構造函數中,把清除工作放在析構函數中。當對象被創建時,構造函數被自動執行。當對象消亡時,析構函數被自動執行。這樣就不用擔心忘記對象的初始化和清除工作。

二.構造函數在C#中的運用

構造函數的名字不能隨便起,必須讓編譯器認得出才可以被自動執行。它的命名方法既簡單又合理:讓構造函數與類同名。除了名字外,構造函數的另一個特別之處是沒有返回值類型,這與返回值類型為void的函數不同。如果它有返回值類型,那么編譯器將不知所措。在你可以訪問一個類的方法、屬性或任何其它東西之前,第一條執行的語句是包含有相應類的構造函數。甚至你自己不寫一個構造函數,也會有一個缺省構造函數提供給你。

下面列舉了幾種類型的構造函數

1)缺省構造函數

class TestClass{  public TestClass(): base() {}}

上面已介紹,它由系統(CLR)提供。

2)實例構造函數

實例構造函數是實現對類中實例進行初始化的方法成員。如:

using System;class Point{public double x, y;public Point(){this.x = 0;this.y = 0;}public Point(double x, double y){this.x = x;this.y = y;}…}class Test{static void Main(){Point a = new Point();Point b = new Point(3, 4); // 用構造函數初始化對象…}}

聲明了一個類Point,它提供了兩個構造函數。它們是重載的。一個是沒有參數的Point構造函數和一個是有兩個double參數的Point構造函數。如果類中沒有提供這些構造函數,那么會CLR會自動提供一個缺省構造函數的。但一旦類中提供了自定義的構造函數,如Point()和Point (double x, double y),則缺省構造函數將不會被提供,這一點要注意。

3) 靜態構造函數

靜態構造函數是實現對一個類進行初始化的方法成員。它一般用于對靜態數據的初始化。靜態構造函數不能有參數,不能有修飾符而且不能被調用,當類被加載時,類的靜態構造函數自動被調用。如:

using System.Data;class Employee{private static DataSet ds;static Employee(){ds = new DataSet(...);}...}

聲明了一個有靜態構造函數的類Employee。注意靜態構造函數只能對靜態數據成員進行初始化,而不能對非靜態數據成員進行初始化。但是,非靜態構造函數既可以對靜態數據成員賦值,也可以對非靜態數據成員進行初始化。

如果類僅包含靜態成員,你可以創建一個private的構造函數:private TestClass() {…},但是private意味著從類的外面不可能訪問該構造函數。所以,它不能被調用,且沒有對象可以被該類定義實例化。

以上是幾種類型構造函數的簡單運用,下面將重點介紹一下在類的層次結構中(即繼承結構中)基類和派生類的構造函數的使用方式。派生類對象的初始化由基類和派生類共同完成:基類的成員由基類的構造函數初始化,派生類的成員由派生類的構造函數初始化。

當創建派生類的對象時,系統將會調用基類的構造函數和派生類的構造函數,構造函數的執行次序是:先執行基類的構造函數,再執行派生類的構造函數。如果派生類又有對象成員,則,先執行基類的構造函數,再執行成員對象類的構造函數,最后執行派生類的構造函數。

至于執行基類的什么構造函數,缺省情況下是執行基類的無參構造函數,如果要執行基類的有參構造函數,則必須在派生類構造函數的成員初始化表中指出。如:

class A{private int x;public A( ) { x = 0; }public A( int i ) { x = i; }}class B : A{private int y;public B( ) { y = 0; }public B( int i ) { y = i; }public B( int i, int j ):A(i) { y = j; }}B b1 = new B(); //執行基類A的構造函數A(),再執行派生類的構造函數B()B b2 = new B(1); //執行基類A的構造函數A(),再執行派生類的構造函數B(int)B b3 = new B(0,1); //執行執行基類A的構造函數A(int) ,再執行派生類的構造函數B(int,int)

在這里構造函數的執行次序是一定要分析清楚的。另外,如果基類A中沒有提供無參構造函數public A( ) { x = 0; },則在派生類的所有構造函數成員初始化表中必須指出基類A的有參構造函數A(i),如下所示:

class A{private int x;public A( int i ) { x = i; }}class B : A{private int y;public B():A(i) { y = 0; }public B(int i):A(i) { y = i; }public B(int i, int j):A(i) { y = j; }}

三.析構函數和垃圾回收器在C#中的運用

析構函數是實現銷毀一個類的實例的方法成員。析構函數不能有參數,不能有任何修飾符而且不能被調用(是系統自動調用)。由于析構函數的目的與構造函數的相反,就加前綴‘~'以示區別。

雖然C#(更確切的說是CLR)提供了一種新的內存管理機制---自動內存管理機制(Automatic memory management),資源的釋放是可以通過“垃圾回收器” 自動完成的,一般不需要用戶干預,但在有些特殊情況下還是需要用到析構函數的,如在C#中非托管資源的釋放。

資源的釋放一般是通過"垃圾回收器"自動完成的,但具體來說,仍有些需要注意的地方:

1. 值類型和引用類型的引用其實是不需要什么"垃圾回收器"來釋放內存的,因為當它們出了作用域后會自動釋放所占內存,因為它們都保存在棧(Stack)中;

2. 只有引用類型的引用所指向的對象實例才保存在堆(Heap)中,而堆因為是一個自由存儲空間,所以它并沒有像"棧"那樣有生存期("棧"的元素彈出后就代表生存期結束,也就代表釋放了內存),并且要注意的是,"垃圾回收器"只對這塊區域起作用;

然而,有些情況下,當需要釋放非托管資源時,就必須通過寫代碼的方式來解決。通常是使用析構函數釋放非托管資源,將用戶自己編寫的釋放非托管資源的代碼段放在析構函數中即可。需要注意的是,如果一個類中沒有使用到非托管資源,那么一定不要定義析構函數,這是因為對象執行了析構函數,那么"垃圾回收器"在釋放托管資源之前要先調用析構函數,然后第二次才真正釋放托管資源,這樣一來,兩次刪除動作的花銷比一次大多的。下面使用一段代碼來示析構函數是如何使用的:

public class ResourceHolder{…~ResourceHolder(){// 這里是清理非托管資源的用戶代碼段}}

四.小結

構造函數與析構函數雖然是一個類中形式上較簡單的函數,但它們的使用決非看上去那么簡單,因此靈活而正確的使用構造函數與析構函數能夠幫你更好的理解CLR的內存管理機制,以及更好的管理系統中的資源。

注:CLR

CLR(公共語言運行庫)和Java虛擬機一樣也是一個運行時環境,它負責資源管理(內存分配和垃圾收集),并保證應用和底層操作系統之間必要的分離。

為了提高平臺的可靠性,以及為了達到面向事務的電子商務應用所要求的穩定性級別,CLR還要負責其他一些任務,比如監視程序的運行。按照.NET的說法,在CLR監視之下運行的程序屬于“受管理的”(managed)代碼,而不在CLR之下、直接在裸機上運行的應用或者組件屬于“非受管理的” (unmanaged)的代碼。

CLR將監視形形色色的常見編程錯誤,許多年來這些錯誤一直是軟件故障的主要根源,其中包括:訪問數組元素越界,訪問未分配的內存空間,由于數據體積過大而導致的內存溢出,等等。

更多關于C#相關內容感興趣的讀者可查看本站專題:《C#程序設計之線程使用技巧總結》、《C#操作Excel技巧總結》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結》、《C#數據結構與算法教程》、《C#數組操作技巧總結》及《C#面向對象程序設計入門教程

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区四区福利| 国产精品三级在线| 国产日韩欧美影视| 在线不卡国产精品| 97精品一区二区视频在线观看| 一本色道久久88综合日韩精品| 久久青草精品视频免费观看| 中文字幕成人精品久久不卡| 欧美在线播放视频| 欧美黑人极品猛少妇色xxxxx| 中文字幕欧美日韩va免费视频| 影音先锋日韩有码| 日韩在线一区二区三区免费视频| 国产精品99免视看9| 成人av在线网址| 亚洲女人天堂色在线7777| 中文在线资源观看视频网站免费不卡| 国产91免费观看| 日日骚久久av| 国产欧美日韩中文| 欧美成人精品在线观看| 91极品女神在线| 国产一区二区三区在线视频| 色青青草原桃花久久综合| 亚洲精品久久久久久下一站| 中文字幕国产精品久久| 久久免费成人精品视频| 色七七影院综合| 国产欧美精品一区二区三区介绍| 亚洲欧美激情四射在线日| 91影院在线免费观看视频| 日韩av免费在线观看| 成人黄色午夜影院| 色悠悠久久久久| 欧美性20hd另类| 亚州欧美日韩中文视频| 2018中文字幕一区二区三区| 色综合五月天导航| 91夜夜揉人人捏人人添红杏| 国产日韩精品视频| 久久视频这里只有精品| yw.139尤物在线精品视频| www国产亚洲精品久久网站| 色噜噜狠狠色综合网图区| 久久亚洲私人国产精品va| 色噜噜国产精品视频一区二区| 欧美午夜精品久久久久久浪潮| 亚洲mm色国产网站| 国产欧美日韩最新| 精品magnet| 欧美高清videos高潮hd| 精品亚洲aⅴ在线观看| 久久久久久69| 亚洲最大成人在线| 亚洲天堂av综合网| 国产午夜精品一区理论片飘花| 午夜精品在线视频| 久久999免费视频| 91福利视频网| 色婷婷**av毛片一区| 国产亚洲aⅴaaaaaa毛片| 日韩国产精品亚洲а∨天堂免| 26uuu另类亚洲欧美日本一| 成人h视频在线观看播放| 中文字幕欧美精品在线| 91黑丝高跟在线| 最新91在线视频| 日本亚洲欧美三级| 欧美做受高潮1| 欧美精品福利视频| 中文字幕一区电影| 91精品综合久久久久久五月天| 九色成人免费视频| 成人久久18免费网站图片| 国产v综合ⅴ日韩v欧美大片| 日韩av一区二区在线| 国产热re99久久6国产精品| 欧美在线视频一区二区| 丝袜亚洲另类欧美重口| 成人久久久久久| 2020久久国产精品| 欧美性生交大片免费| 国产日韩综合一区二区性色av| 伊人亚洲福利一区二区三区| 国产精品一区二区三区成人| 久久精品成人欧美大片| 日韩av在线免费播放| 亚洲精品影视在线观看| 国产精品电影网站| 亚洲欧美精品一区二区| 伊人久久综合97精品| 97国产一区二区精品久久呦| 国产成人精品一区| 欧美激情成人在线视频| 欧美精品videos性欧美| 91国内在线视频| 最近2019中文字幕在线高清| 国产成人综合精品| 久久免费福利视频| 亚洲女人天堂色在线7777| 日韩一区二区三区国产| 久久夜色精品国产亚洲aⅴ| 国产亚洲视频中文字幕视频| 国产日韩在线播放| 亚洲午夜精品久久久久久久久久久久| 色综合五月天导航| 国产视频精品一区二区三区| 国产欧美精品久久久| 日韩欧美在线免费观看| 欧美成人免费播放| 欧美午夜丰满在线18影院| 午夜精品一区二区三区在线视频| 色综合色综合久久综合频道88| 欧美黄色性视频| 色偷偷88888欧美精品久久久| 日韩性xxxx爱| 久久精品99国产精品酒店日本| 国产成人av网| 亚洲一区二区黄| 日韩一区二区三区xxxx| 91免费视频网站| 热久久美女精品天天吊色| 97超碰色婷婷| 57pao国产成人免费| 最新国产精品亚洲| 亚洲男人天堂手机在线| xxxx欧美18另类的高清| 国产第一区电影| 国产精品精品视频一区二区三区| 国产精品第100页| 欧美日韩午夜视频在线观看| 成人信息集中地欧美| 国产欧美亚洲视频| 1769国内精品视频在线播放| 91精品在线国产| 国产人妖伪娘一区91| 中文字幕亚洲国产| 欧美激情2020午夜免费观看| 欧美在线亚洲一区| 国内精品久久影院| 久久99久国产精品黄毛片入口| 久久av资源网站| 亚洲第一男人天堂| 久久人人爽人人爽爽久久| 国产精品成人一区二区三区吃奶| 欧美日韩xxx| 久久成人亚洲精品| 国模精品视频一区二区| 91av免费观看91av精品在线| 一区二区三区天堂av| 色综合老司机第九色激情| 欧美激情视频一区二区三区不卡| 成人美女免费网站视频| 欧美在线免费观看| 国产激情999| 欧美性受xxx| 精品国产区一区二区三区在线观看| 亚洲一区二区三区sesese| 成人a在线视频| 久久成人精品电影| 色老头一区二区三区在线观看| 不卡av电影在线观看| 国产精品老牛影院在线观看| 国产精品视频免费在线|