zoukankan      html  css  js  c++  java
  • 【转】编写高质量代码改善C#程序的157个建议——建议36:使用FCL中的委托声明

    建议36:使用FCL中的委托声明

     FCL中存在3类这样的委托声明,它们分别是:Action、Func、Predicate。尤其是在它们的泛型版本出来以后,已经能够满足我们在实际编码过程中的大部分需求。

    • Action表示接受0个或多个输入参数,执行一段代码,没有任何返回值;
    • Func表示接受0个或多个输入参数,执行一段代码,带返回值;
    • Predicate表示定义一组条件并判读参数是否符合条件。

    Action的重载版本有17个,最多参数的重载有16个参数。

    Func的重载版本有17个,最多参数的重载有16个参数。

    注意:很少方法的参数能够超过16个,如果真有这样的参数,首先要考虑自己设计是否存在问题。另外,我们也可以使用params关键字来减少参数的声明。如:

    static void Method1(params int[] i)

    表示该方法接受0个或多个整型参数。

            delegate int AddHandler(int i, int j);
            delegate void PrintHandler(string msg);
    
            static void Main(string[] args)
            {
                AddHandler add = Add;
                PrintHandler print = Print;
                print(add(1, 2).ToString());
            }
    
            static int Add(int i, int j)
            {
                return i + j;
            }
    
            static void Print(string msg)
            {
                Console.WriteLine(msg);
            }

    委托声明AddHandler和PrintHandler完全可以被Func与Action取代。

            static void Main(string[] args)
            {
                Func<int, int, int> add = Add;
                Action<string> print = Print;
                print(add(1, 2).ToString());
            }
    
            static int Add(int i, int j)
            {
                return i + j;
            }
    
            static void Print(string msg)
            {
                Console.WriteLine(msg);
            }

    我们应该习惯在代码中使用这类委托来代替自己的委托声明。

    处理Action、Func和Predicate外,FCL中还有用于表示特殊含义的委托声明。如

    用于表示注册事件方法的委托声明:

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

    表示线程方法的委托声明:

    public delegate void ThreadStart();
    public delegate void ParameterizedThreadStart(object obj);

     表示异步回调的委托声明:

    public delegate void AsyncCallback(IAsyncResult ar);

    在FCL中每一类委托声明都代表一类特殊的用途,虽然可以使用自己的委托声明来代替,但是这样做不仅没有必要,而且会让代码失去简洁性和标准性。在我们实现自己的委托声明前,应该首先查看MSDN,确信有必要后才这样做。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    LeetCode 842. Split Array into Fibonacci Sequence
    LeetCode 1087. Brace Expansion
    LeetCode 1219. Path with Maximum Gold
    LeetCode 1079. Letter Tile Possibilities
    LeetCode 1049. Last Stone Weight II
    LeetCode 1046. Last Stone Weight
    LeetCode 1139. Largest 1-Bordered Square
    LeetCode 764. Largest Plus Sign
    LeetCode 1105. Filling Bookcase Shelves
    LeetCode 1027. Longest Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7943713.html
Copyright © 2011-2022 走看看