溫故知新---重讀C#InDepth(一)

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   for   re   c   

一本好書,或是一本比較有深度的書,就是每次研讀的時候都會有新的發現。

好吧,我承認每次讀的時候都有泛泛而過的嫌疑~~

這幾年一直專註於C#用戶端的開發,逐步從迷迷糊糊,到一知半解,再到自以為是,最後沉下心重新審視。也許這也是一種進步一種自我學習的過程。

前面囉嗦了這麼多,希望大家也能不那麼浮躁的“深入理解”C#這麼語言的每個知識點。本文總結書本中的知識,在結合實際應用場合進行概述,如果有不正確的地方,還請不吝指教。

文章中的內容比較淺顯,請高手略過此文。

 

1. 簡化了的COM操作
        private void Button_Click(object sender, RoutedEventArgs e)        {            var Product = new List<Good>();            Product.Add(new Good() { Name = "Tom", Age = 21 });            Product.Add(new Good() { Name = "Json", Age = 22 });            Product.Add(new Good() { Name = "Jacob", Age = 26 });            var app = new Microsoft.Office.Interop.Excel.Application() { Visible = false };            Workbook wb = app.Workbooks.Add();            Worksheet ws = app.ActiveSheet;            int row = 1;            foreach (var good in Product)            {                ws.Cells[row, 1].Value = good.Name;                ws.Cells[row, 2].Value = good.Age; // Dynamic C# 4.0 syntax                row++;            }            wb.SaveAs(Filename: PractiseDemoLib.Util.RootPath + "Demo.xls", FileFormat: XlFileFormat.xlWorkbookNormal);            app.Application.Quit();        }
    public class Good    {        public string Name { get; set; }        public Int32 Age { get; set; }    }

 

程式中引入Microsoft.Office.Interop.Excel組件,如果沒有可以下載,或者安裝Excel即可。
這是C#4.0 文法的優雅運算式(紅色字型部分),這樣避免了之前十分囉嗦的實現方式,Dynamic文法不僅僅局限在這裡,其在反射編程和與其他語音互動上有著“動態”的優勢,在之後的篇幅中會有介紹。

 

2. 泛型約束
    public class A<T> where T : class ,IDisposable, new()    {        public string Name { get; set; }    }    public class A<T, U>        where T : class ,IDisposable, new()        where U : class,T    {        public string Name { get; set; }    }    /*     * 不能約束的例子     * Class B<T> : where T : Object, System.Enum, System.ValueType, System.Delegate     * * */

泛型的出現更多的是為瞭解決裝箱和拆箱的效率問題,並且利用泛型,程式得到更大程度的複用。而泛型約束就是約束輸入類型的類型,使其應該具有某類型的方法或屬性。

這裡有幾點要注意下:

1.  類型T可以約束成class,介面類型等,但不能約束成where T : Object, System.Enum, System.ValueType, System.Delegate。

2.  類型T的構造必須是無參建構函式(CLR並未有此約束,所以通過某些方式依然可以構建,只不過不是IDE模式下),即約束成new T() 模式,並且new() 要放在約束列表的最後。

3.  類型T可以被約束成類型U。

 

3. 靜態類型嵌套

涉及到靜態類型需要重點區分的是靜態類型和執行個體類型,靜態構造和執行個體的構造。

    public class Outer<T>    {        public class Inner<U, V>        {            readonly static int HashCode;            static bool IsInit = false;            static Inner()            {                HashCode = typeof(Outer<T>).GetHashCode();            }            public static void DynamicMethod(object sender)            {                var win = sender as MainWindow;                win.OutPutMsg(string.Format("[{4},{3}] Outer<{0}>.Inner<{1},{2}>", typeof(T), typeof(U), typeof(V), HashCode.ToString(), IsInit.ToString()));                IsInit = true;            }        }    }   private void Button_Click(object sender, RoutedEventArgs e)   {            Outer<int>.Inner<string, DateTime>.DynamicMethod(this);            Outer<string>.Inner<int, int>.DynamicMethod(this);            Outer<object>.Inner<string, int>.DynamicMethod(this);            Outer<int>.Inner<string, DateTime>.DynamicMethod(this);    }

這個例子主要示範的是靜態建構函式只唯一初始化一回,這樣就導致了當點擊Button_Click之後,只會初始化三回對象,因為第一組和第四組,程式認為輸入參數都相同,只初始化一回靜態構造。

[False,29514189] Outer<System.Int32>.Inner<System.String,System.DateTime>[False,53070131] Outer<System.String>.Inner<System.Int32,System.Int32>[False,39345664] Outer<System.Object>.Inner<System.String,System.Int32>[True,29514189] Outer<System.Int32>.Inner<System.String,System.DateTime>

上面就是顯示結果,大家可以對比下代碼。

 

持續更新:範例程式碼下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.