study Mvc step by step (三)C#语言特性扩展方法
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作为它的第一个参数,并在后面跟着他所扩展的类的名称
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。