您好,登錄后才能下訂單哦!
目錄:
【C#小知識】C#中一些易混淆概念總結--------數據類型存儲位置,方法調用,out和ref參數的使用
----------------------------------分割線--------------------------------------
這一系列的文章在園子里還是比較受歡迎的。有一些留言指出了其中理論性的錯誤,怎么寫出來這些文章的,有沒有培訓過等等問題。
下面就一并的回答這些問題吧。
1)自己今年六月份畢業,現在在帝都實習。不過在學校已經做過一些C#開發了,現在也是做.NET開發工作。
2)文章中很多知識是自己以前在網上下載的視頻教程,學習過程中所記的筆記。也就是在年前的時候,突然有一天發現自己的筆記本記了差不多塊一本了,之前也沒時間整理過,所以就想著把它們整理成博客文章,順便溫習一下這些筆記知識。
3)有園友問自己是不是在傳智培訓過。首先說我沒有培訓過,但是非常感謝傳智公開的一些自學教程。因為自己也是這些視頻的受益者,學到了很多知識,養成了一些好的學習習慣。
4)在整理筆記的過程中遇到了很多問題,其中自己參考了《C#本質論》,《CLR via C#》還有就是MSDN的官方文檔。
3)不管怎樣還是會遇到一些自己解決不掉或者弄不清楚的問題,這個過程使用了Google搜索并和請教了一些園友。
4)錯誤總是會存在。謝謝看我博客的讀者你們的細心,指出了我博文中的錯誤。確定這些錯誤后,我都立即修改了自己的文章。
---------------------------------------------分割線-----------------------------------------------------
今天開始上班了。這幾天研究學習了一下思維導圖,感覺用它整理自己的知識非常的方便。所以,以后寫博客完成一個知識點,都會用思維導圖做一個總結。也能讓大家對所要讀的內容有一個整體的把握。
我用的思維導圖軟件是FreeMind(免費的,但是得裝JDK),因為剛開始學習使用,很多操作技巧不是很熟練,做出來的導圖估計也不是很好,希望大家見諒。
首先,里氏替換原則。
這是理解多態所必須掌握的內容。對于里氏替換原則維基百科給出的定義如下:
為什么子類可以替換父類的位置,而程序的功能不受影響呢?
當滿足繼承的時候,父類肯定存在非私有成員,子類肯定是得到了父類的這些非私有成員(假設,父類的的成員全部是私有的,那么子類沒辦法從父類繼承任何成員,也就不存在繼承的概念了)。既然子類繼承了父類的這些非私有成員,那么父類對象也就可以在子類對象中調用這些非私有成員。所以,子類對象可以替換父類對象的位置。
來看下面的一段代碼:
我們運行打印出的結果是:
根據前面的構造函數的知識很容易解釋這個結果。那么我們在Main()函數中添加如下的代碼:
在訪問的過程中,可以發現p只可以訪問父類的say
而p1也只可以訪問父類的Say方法
其實在上面的代碼中,就滿足了里氏替換原則。子類的Student對象,替換了父類Person對象的位置。
那么它們在內存中發生了些什么呢?如下圖:
由上可以知道,當一個父類的變量指向一個子類對象的時候只能通過這個父類變量調用父類成員,子類獨有的成員無法調用。
同理我們可以推理出,子類的變量是不可以指向一個父類的對像的
但是當父類變量指向一個子類變量的時候,可以不可以把父類的變量轉化成子類的對象呢?看下圖
關于引用類型的兩種轉換方式:
由上面的代碼我們已經知道了一種轉換,就是在變量錢直接加需要轉換的類型,如下代碼:
Student s2 = (Student)p1;
那么第二種轉換方式就是使用as關鍵字,如下代碼:
//將指向子類對象的變量轉化成子類類型
Student s2 = (Student)p1;
//使用as關鍵字,轉換失敗返回一個null值
Student s3 = p1 as Student;
使用as關鍵字和第一種強制轉換的區別就是,第一種如果轉換失敗會拋異常,第二種轉換失敗則返回一個null值。
思維導圖總結如下:
二,虛方法
使用virtual關鍵字修飾的方法,叫做虛方法(一般都是在父類中)。
看下面的一段代碼:
緊接著在main()函數中添加如下的代碼:
打印結果如下:
我們很明顯的可以發現,第二個表達式滿足里氏替換原則,p1.Say()執行的應該是父類的Say()方法,但是這里卻執行了子類的Say()方法。
這就是子類使用override關鍵字的Say()方法覆蓋了父類的用Virtual關鍵字修飾的Say()方法。
我們使用動態圖片看一下調試過程,
①首先是沒有使用任何關鍵字:
由上可以看出直接跳入父類,執行了父類的Say()方法;
②再看使用virtual和override關鍵字的動態調試圖片,如下:
可以看到直接到子類去執行override關鍵字修飾的Say()方法。
那么如果父類使用virtual關鍵字修飾,而子類沒有重寫該方法時會怎么樣呢?如下面的代碼:
執行結果如下:
所以,如果子類找不到override方法,則會回溯到該子類的父類去找是否有override方法,知道回溯到自身的虛方法,并執行。
虛方法知識總結的思維導圖如下:
如果您覺得不錯,點擊右下角贊一下吧!您的支持,是我寫作的動力!
畢業實習交流群:221376964。你也可以關注我的新浪微博進行交流。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。