程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 編寫高質量代碼改善C#程序的157個建議[為泛型指定初始值、使用委托聲明、使用Lambda替代方法和匿名方法]

編寫高質量代碼改善C#程序的157個建議[為泛型指定初始值、使用委托聲明、使用Lambda替代方法和匿名方法]

編輯:C#入門知識

前言

  泛型並不是C#語言一開始就帶有的特性,而是在FCL2.0之後實現的新功能。基於泛型,我們得以將類型參數化,以便更大范圍地進行代碼復用。同時,它減少了泛型類及泛型方法中的轉型,確保了類型安全。委托本身是一種引用類型,它保存的也是托管堆中對象的引用,只不過這個引用比較特殊,它是對方法的引用。事件本身也是委托,它是委托組,C#中提供了關鍵字event來對事件進行特別區分。一旦我們開始編寫稍微復雜的C#代碼,就肯定離不開泛型、委托和事件。本章將針對這三個方面進行說明。

本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html 。本文主要學習記錄以下內容:

  建議35、使用default為泛型類型指定初始值

  建議36、使用FCL中的委托聲明

  建議37、使用lambda表達式代替方法和匿名方法

建議35、使用default為泛型類型指定初始值

  有些算法,比如泛型集合List<T>的Find算法,所查找的對象有可能會是值類型,也有可能是引用類型。在這種算法內部,我們常常會為這些值類型變量或引用類型變量指定默認值。於是,問題來了:值類型變來那個的默認初始值是0值,而引用類型變量的默認初始值是null值,顯然,這會導致下面編譯出錯:

C#編譯器會阻止這樣的代碼通過編譯。要讓編譯器接收為一個泛型類型參數指定一個初始值,最妥當的辦法就是使用default關鍵字。所以,在上面的代碼應該改為:

        public T Func<T>()
        {
            T t = default(T);
            return t;
        }

這樣如果它在運行時碰到的T是一個整型,那麼運行時會為其賦值0;如果T在運行時是一個Person這樣的引用類型,則會為其賦null值。

建議36、使用FCL中的委托聲明

 要注意FCL中存在三類這樣的委托聲明,他們分別是:Action、Func、Predicate。尤其是在他們的泛型版本出來以後,已經能夠滿足我們在實際編碼過程中的大部分需要。

這裡是之前一篇關於Action、Func、Predicate的有關介紹http://www.cnblogs.com/aehyok/p/3382291.html

除了Action、Func、Predicate外,FCL中還有用於標識特殊含義的委托聲明。如用於表示注冊事件方法的委托聲明:

public delegate void EventHandler(object sender,EventArgs e);

public delegate void EnentHandler<TEventArgs>(object sender,TEventArgs e);

表示線程的委托聲明:

public delegate void ThreadStart();

public delegate void ParameterizedThreadStart(object obj);

表示異步回調的委托聲明:

public delegate void AsyncCallback(IAsyncResult ar);

在FCL中沒一類委托聲明都代表一類特殊的用途,雖然可以使用自己的委托聲明來代替,但是這樣做不僅沒有必要,而且會讓代碼失去簡潔性和標准型。在我們實現自己的委托聲明前,應該首先查看MSDN,確信有必要之後才這樣做。

建議37、使用lambda表達式代替方法和匿名方法

首先我們使用Action和Func來做一個簡單的小例子,控制台應用程序代碼如下所示:

第一個版本

    class Program
    {
        static int Add(int i, int j)
        {
            return i + j;
        }

        static void Print(string message)
        {
            Console.WriteLine(message);
        }

        static void Main(string[] args)
        {
            Func<int, int, int> add = Add;
            Action<string> print = Print;
            print(add(4, 5).ToString());
            Console.ReadLine();
        }
    }

實際上要完成上面的功能,還有多種編碼方式,先來看一種最中規中矩的方式,同時也是最繁瑣的寫法:

第二個版本

    class Program
    {
        static int Add(int i, int j)
        {
            return i + j;
        }

        static void Print(string message)
        {
            Console.WriteLine(message);
        }

        static void Main(string[] args)
        {
            Func<int, int, int> add = new Func<int,int,int>(Add);
            Action<string> print =new Action<string>(Print);
            print(add(4, 5).ToString());
            Console.ReadLine();
        }
    }

其實也就是將第一個版本稍作調整。從上面的寫法中也可以看出:Add方法和Print方法實際上都只有一條語句,因此,使用匿名方法也許是一種更好的選擇:

第三個版本

        static void Main(string[] args)
        {
            Func<int, int, int> add = new Func<int,int,int>(delegate(int i,int j)
                {
                    return i+j;
                });
            Action<string> print =new Action<string>(delegate(string message)
                {
                    Console.WriteLine(message);
                });
            print(add(4, 5).ToString());
            Console.ReadLine();
        }

使用匿名方法以後,我們不需要在Main方法外部聲明兩個方法了,可以直接在Main這個工作方法中完成所有的代碼編寫,而且不會影響代碼清晰性。實際上,所有代碼行數不超過3行的方法(條件是它不倍重用),我們都建議采用這種方式來編寫。上面的版本繼續改進:

第四個版本

        static void Main(string[] args)
        {
            Func<int, int, int> add = delegate(int i,int j)
                {
                    return i+j;
                };
            Action<string> print =delegate(string message)
                {
                    Console.WriteLine(message);
                };
            print(add(4, 5).ToString());
            Console.ReadLine();
        }

以上代碼看上去更簡化了,不過,最終極的改進是使用lambda表達式:

第五個版本

        static void Main(string[] args)
        {
            Func<int, int, int> add = (x, y) => x = y;
            Action<string> print = (message) => Console.WriteLine(message);
            print(add(4, 5).ToString());
            Console.ReadLine();
        }

Lambda表達式操作符”=>“的左側是方法的參數,右側是方法體,其本質是匿名方法。實際上,經過編譯後Lambda表達式就是一個匿名方法。我們應該在實際的編碼工作中熟練運用它,避免寫出繁瑣且不美觀的代碼。

 

英語小貼士

1、Your passport and declaration card, please.——請出示護照和申報單。

2、This is a souvenir that I'm taking to Taiwan.——這是我要帶去台灣的當地紀念品。

3、Do you have anything to declare?——是否有任何東西需要申報?

4、Do you have any liquor or cigarettes?——你有攜帶任何酒類或香煙嗎?   No, I don't.——沒有。

5、Yes, I have two bottles of whisky.——是的,我帶了兩瓶酒。

6、Please open this bag.——請打開這個袋子。

7、The camera is for my personal use.——這個相機是我私人使用的。

8、What are these?——這些東西是做何用?

9、You'll have to pay duty on this.——你必須為這項物品繳付稅金。

10、These are for my personal use.——這些是我私人使用的東西。

11、Do you have any other baggage?——你還有其它行李嗎?

12、These are gifts for my friends.——這些是給朋友的禮物。

13、O.K. Please give this declaration card to that officer at the exit.——好了!請將這張申報卡交給出口處的官員。

作者:aehyok

出處:http://www.cnblogs.com/aehyok/

感謝您的閱讀,如果您對我的博客所講述的內容有興趣,那不妨點個推薦吧,謝謝支持:-O。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved