C# 扩展方法

C# 扩展方法

假设该类是密封的,不能访问代码,或有其他的设计原因使这些方法不能工作,就不得不在另一个类中使用该类的公有可用成员编写一个方法。
假设这个类是密封的:

  sealed class MyData
    {
        double D1;
        double D2;
        double D3;

        public MyData(double d1,double d2,double d3)
        { 
            D1 = d1;
            D2 = d2;    
            D3 = d3;    
        }
        public double Sum()
        {
            return D1 + D2 + D3; ; ;
        }
        
    }

上述类中计算了三个数的和,假如我们需要计算三个数的平均值:
那就需要重新写一个类如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WFM_Thread
{
    public partial class Form9 : Form
    {
        public Form9()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyData myData = new MyData(3, 4, 5);
            double average = ExtendMyData.Average(myData);
            Console.WriteLine("平均值为:{0}", average);

        }
    }


    static class ExtendMyData
    {
        public static double Average(MyData md)
        {
            return md.Sum() / 3;
        }
    }
}

注意看上述的代码使用的是 ExtendMyData.Average(myData),但如果能在类的实例自身上调用该方法,而不是创建另一个作用于它的类的示例,将会更优雅。

 ExtendMyData.Average(myData)//静态调用形式
 myData.Average();//实例调用形式
 

下面将类ExtendMyData改编成为类MyData的扩展方法:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WFM_Thread
{
    public partial class Form9 : Form
    {
        public Form9()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyData myData = new MyData(3, 4, 5);
            double average = myData.Average();
            Console.WriteLine("平均值为:{0}", average);

        }
    }


    static class ExtendMyData
    {
        public static double Average(this MyData md)
        {
            return md.Sum() / 3;
        }
    }
}

扩展方法的重要要求如下:
声明扩展方法的类必须声明为static;
扩展方法本身必须声明为static;
扩展方法必须包含关键字this作为它的第一个参数类型,并在后面跟着它所扩展的类的名称。

你可能感兴趣的:(c#,开发语言)