C# 擴展方法


  MSDN中的定義是:擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this修飾符為前綴。  

  有點難懂,還是通過例子了解它吧

  通過擴展方法,我們可以為一些.NET內置對象添加方法了,下面是為string添加一個SayHello方法

using System;namespace 擴展方法
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = null;
            str.SayHello();
            string str1 = "not hello";
            str1.SayHello();
            Console.ReadKey();
        }
    }

    public static class Extension   //  必須是一個靜態類
    {
        public static void SayHello(this string str)    //必須為public static 類型,且參數使用this關鍵字
        {
            if (str == null)
            {
                Console.WriteLine("Hello");
            }
            else
                Console.WriteLine("{0}", str);
        }
    }
}

這樣的話在同一個命名空間下的所有string都可以使用SayHello方法了,重申一下代碼注釋中的重要要求

首先聲明擴展方法的類必須是static類,並且方法也要是static類型,擴展方法必須包含this關鍵字作為它的第一個參數類型,並且后面跟着它所擴展的類的名稱

 

同樣也可以為自定義對象添加擴展方法,為MyClass添加了一個getAvg方法

using System;

namespace 擴展方法
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass(3,4);
            Console.WriteLine("avg is {0}", mc.getAvg());
            Console.ReadKey();
        }
    }

    class MyClass
    {
        private double width, height;

        public MyClass(double val1, double val2)
        {
            width = val1;
            height = val2;
        }

        public double getSum()
        {
            return width + height;
        }
    }

    static class ExtendMyClass
    {
        public static double getAvg(this MyClass mc)
        {
            return mc.getSum() / 2;
        }
    }
}

 

還可以為泛型類添加擴展方法,規則跟非泛型十分類似

using System;
using System.Collections.Generic;

namespace 擴展方法
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass<int> mc = new MyClass<int>(6);
            mc.Print();
            Console.ReadKey();
        }
    }

    class MyClass<T>
    {
        private T data;

        public MyClass(T val)
        {
            data = val;
        }

        public T getData()
        {
            return data;
        }
    }

    static class ExtendMyClass
    {
        public static void Print(this MyClass<int> mc)
        {
            Console.WriteLine("Data is {0}",mc.getData());
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM