不管我們學習什麼語言,一開始都是語法,對於面向對象的語言來講,學習完語法之後,就是OOP了,主要還是三大概念:繼承,多態,封裝。而且我們經常也會遇到一些面試題,會考察我們父子類之間的繼承關係等。 這段時間深造ASP.NET-MVC框架,研讀<<asp.net-mvc框架揭秘>>一書的時候,感覺到了自 ...
不管我們學習什麼語言,一開始都是語法,對於面向對象的語言來講,學習完語法之後,就是OOP了,主要還是三大概念:繼承,多態,封裝。而且我們經常也會遇到一些面試題,會考察我們父子類之間的繼承關係等。
這段時間深造ASP.NET-MVC框架,研讀<<asp.net-mvc框架揭秘>>一書的時候,感覺到了自己的不足與渺小。儘管大三就看過這本書,但那時候看的懵逼,半知半解吧。再過了差不多一年之後再回頭看這本書,學到了不同的知識,也看到了不同的一面,這說明自己也是在逐步提升的。這兩天研讀Controller激活原理的時候,深入的思考了一下,下載了源碼看,發現看的很是懵逼啊,<<揭秘>>一書儘管一開始就寫了個簡單地mvc框架,但是相比較於源碼中的代碼還是縮減了很多,不過我看源碼還是看的很懵逼,主要還是各個類之間的實現以及解耦的設計太好了,有一部分我特別不懂,於是自己寫了個demo分析,分析完之後發現原來就是父子類之間的繼承關係而已,以及C#特有的委托特性。不多說,直接上我的demo:
using System; namespace ConsoleApp1 { public class MyTest2 { public MyTest2(Func<string> func) { if(func==null) { throw new ArgumentNullException("error ... "); } func(); Console.WriteLine("successful ... "); } } public class MyTest { public Func<string> _func = () => null; private static MyTest _instance = new MyTest(); public MyTest() : this(null) { Console.WriteLine("Construction .... "); } public MyTest(MyTest2 s) { MyTest2 _s = s ?? new MyTest2(_func); } public static MyTest Current { get { return _instance; } } public static string text { get { return "text .... "; } } public void Beta() { Console.WriteLine("function be called"); } public static string Func_Test() { return null; } } class Program { static void Main(string[] args) { MyTest.Current.Beta(); Console.Read(); } } }
我一開始就看不懂在_func屬性明明就是返回來了null,在MyTest2中的if判斷應該成立啊,後來斷點調試看了下:
這是記憶體地址啊,後來我改了下:
public Func<string> _func = () => null;
改成了:
public Func<string> _func = Func_Test;
後來才反應過來,原來傳遞的參數根本就是一個函數地址而已,if中的null是用來判斷是不是沒有傳參的。
其次就是構造函數了,我已開始比較納悶MyTest的第二個構造函數是怎麼調用的,後來想想原來是第一個構造函數繼承自了this(null),引發了調用!
通過這個demo也算是讓自己鞏固了基礎吧。