码迷,mamicode.com
首页 > Web开发 > 详细

study Mvc step by step (三)C#语言特性扩展方法

时间:2014-08-18 21:58:02      阅读:277      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   io   数据   ar   cti   

  C#3.0之后推出了扩展方法。我们通常看到的方法都是和声明它的类相关联。扩展方法特性扩展这个边界,允许编写的方法和声明它的类之外的类关联。

要想知道可以如何使用这个特性,请看下面的代码。它包含类MyPerson.该类存贮了3个double类型的值,并含有一个构造函数和一个名称为sum的方法,该方法返回3个存储值得和。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 河南云和数据
{
    class MyPerson
    {
        private double p1;
        private double p2;
        private double p3;

        public MyPerson(double p1, double p2, double p3)
        {
            this.p1 = p1;
            this.p2 = p2;
            this.p3 = p3;
        }

        public double Sum()
        {
            return p1 + p2 + p3;
        }
    }
}

这是一个非常有限的类,但假如它还含有另外一个方法会更有用,该方法返回 3个数据的平均值。使用已经了解的关于类的内容。还有几种方法可以实现这个额外的功能。
1:如果你有源代码并可以修改这个类,当然你需要为这个类添加一个新方法。然而,如果不能修改这个类(如这个类在一个第三方类库中),那么只要它不是密封类的,你就能把它用作一个基类并在派生自它的类中实现这个额外的方法。

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

例如,可以编写下面这样得类。下面的代码包含一个名称为ExtendMyPerson的静态类,它含有一个名称为average的静态方法,该方法实现了额外功能。注意该方法是接受mypersondata的实例作为参数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 河南云和数据
{
   static class ExtendMyData
    {

       public static double Average(MyPerson p)
       {
           return p.Sum() / 3;
 
       }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 河南云和数据
{
    class Program
    {
        static void Main(string[] args)
        {
            MyPerson person = new MyPerson(3,4,5);
            Console.WriteLine("Average:{0}",ExtendMyData.Average(person));
            Console.ReadKey();
        }
    }
}

尽管这是非常好的解决方案,但如果能在类的实例自身上调用该方法,而不是创建另一个作用于它的类的实例。将会更优雅。下面两行代码阐明了他们的区别。第一种使用刚显示的方法:在另一个类中的实例上调用静态方法。第二种展示了我们愿意使用的方式:在自身对象上调用实例方法。

扩展方法允许你使用第二种形式,即使第一种形式可能编写这种调用的正常方式。

通过对方法average的声明做一个小小的改动,就可以使用实例调用形式。需要做的修改是在参数声明中的类型名称加上关键字this,如下面所示。把this关键字加到静态类的静态方法的第一个参数上,把该方法从类ExendMyPersonData的常规方法改变成类MyPersonData的扩展方法。现在变成了.

 static class ExtendMyData
    {

       public static double Average(this MyPerson p)
       {
           return p.Sum() / 3;
 
       }

    }

扩展方法的重要要求如下

声明扩展方法的类必须是static

扩展方法本身必须声明static

扩展方法必须包含关键字this作为它的第一个参数,并在后面跟着他所扩展的类的名称

 

study Mvc step by step (三)C#语言特性扩展方法,布布扣,bubuko.com

study Mvc step by step (三)C#语言特性扩展方法

标签:style   blog   color   使用   io   数据   ar   cti   

原文地址:http://www.cnblogs.com/renyanlei/p/3920469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!