首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 進階 (八):委派深度解析與匿名方法實戰

     編輯:關於C#

C# 委派完整指南:定義、實例化、匿名方法、多播委派與實戰應用模式

委派是型別安全的函式指標,用於將方法作為參數傳遞。本文涵蓋委派宣告、具名/匿名方法實例化、策略模式範例、多播委派概念。

一、委派基本宣告與使用


using System;

namespace gosoa.com.cn
{
    public class test
    {
        // 宣告委派:回傳 string,無參數
        public delegate string GetAString();

        public static void Main()
        {
            int x = 10;
            // 實例化委派,綁定 x.ToString 方法
            GetAString firstString = new GetAString(x.ToString);
            Console.WriteLine(firstString()); // 呼叫委派,等同 x.ToString()
        }
    }
}
  • 委派語法類似方法簽名,前加 delegate 關鍵字。
  • 委派本質為類別,可在任何可定義類別處宣告。
  • 委派自帶建構函式,接受符合簽名的方法群組。

二、匿名方法

C# 2.0 引入,直接在委派實例化處撰寫方法主體。


using System;

namespace gosoa.com.cn
{
    public class test
    {
        delegate string GetUrl(string val);

        static void Main(string[] args)
        {
            string domain = "www.gosoa.com.cn";
            GetUrl url = delegate(string param)
            {
                param = "https://" + param;
                return param;
            };
            Console.WriteLine(url(domain)); // https://www.gosoa.com.cn
        }
    }
}

三、實戰案例:數學運算策略

具名方法版本


using System;

namespace gosoa.com.cn
{
    class NumberOperation
    {
        public static double NumOne(double x) { return x * 2; }
        public static double NumTwo(double x) { return x * x; }
    }

    public class delegateTest
    {
        delegate double DoubleOperation(double x);

        static void PrintNumber(DoubleOperation dp, double x)
        {
            double result = dp(x);
            Console.WriteLine("value is {0}, result of DoubleOperation is {1}:", x, result);
        }

        static void Main()
        {
            DoubleOperation doption = new DoubleOperation(NumberOperation.NumOne);
            PrintNumber(doption, 1.5); // value is 1.5, result is 3

            doption = new DoubleOperation(NumberOperation.NumTwo);
            PrintNumber(doption, 3.2); // value is 3.2, result is 10.24
        }
    }
}

匿名方法精簡版


using System;

namespace gosoa.com.cn
{
    public class delegateTest
    {
        delegate double DoubleOperation(double x);

        static void PrintNumber(DoubleOperation dp, double x)
        {
            double result = dp(x);
            Console.WriteLine("value is {0}, result of DoubleOperation is {1}:", x, result);
        }

        static void Main()
        {
            DoubleOperation doptionOne = delegate(double x) { return x * 2; };
            DoubleOperation doptionTwo = delegate(double x) { return x * x; };

            PrintNumber(doptionOne, 1.5);
            PrintNumber(doptionTwo, 3.2);
        }
    }
}

四、多播委派

  • 委派可串聯多個方法 (+=),依序呼叫 (-= 移除)。
  • 回傳值非 void 時,僅保留最後一個方法的回傳值。
  • 事件機制即建立在多播委派基礎上。

五、委派應用場景總結

  1. 回呼/策略模式:將演算法封裝為委派,執行時動態注入。
  2. 事件處理:發布-訂閱模式核心。
  3. 執行緒啟動:ThreadStart 委派。
  4. 非同步程式設計 (APM):BeginInvoke/EndInvoke。
  5. LINQ 查詢:Lambda 運算子 => 本質為委派/運算式樹。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved