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作为它的第一个参数,并在后面跟着他所扩展的类的名称

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

时间: 2024-08-05 10:59:20

study Mvc step by step (三)C#语言特性扩展方法的相关文章

ASP.NET MVC学前篇之扩展方法、链式编程

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,

MVC @Html 扩展方法

在使用MVC开发过程中发现在View中需要一些自定义的方法,以前在webfrom开发是则是使用一个静态类,在里面编辑许多经常使用的方法来解决的.现在发现在MVC里面可以自定义扩展的HtmlHelper方法,具体操作如下:1.新建一个类  可以在项目中添加一个文件夹,命名为Helpers,在这个文件夹中可以添加各个类型的扩展类.下面我们添加一个文本处理扩展类,命名TextHelper.cs.注意:把该类的命名空间改为 namespace System.Web.Mvc,这样就可以在页面中使用该扩展方

study Mvc step by step (一) 什么是Mvc啊?

当我们开始逐步把Net平台上面的Web开发从webform过度到MVC 开发的时候.我们总想弄清楚Mvc到底是什么??其实Mvc并不是Net特有的一种开发技术.而是一种软件开发的模式.早在上个世界80年代.Xerox PARC为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用.那么什么是Mvc呢? MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: Model(模型)表示应用程序核心(比如数据库记录列

study Mvc step by step (二) 关于MVC的一些C#特有语法

在我们即将进入ASP.NET开发大门的时候.我们需要先学习一些C#的特有语法.而且对于传统的webform的开发,我们介绍的这些C#特有语法并不是每个人都熟悉的.本节将介绍一个MVC优良程序员所需要的C#语言特性. 一:c#的基本特性 1.1使用自动实现的属性 c#属性特性让你暴露一个类的数据片段,这些数据以及如何设置和接收数据采取了一种松耦合的方式.就是说并不是直接和我们类中的字段相关联,而是通过一个对外的接口.我们首先看一下下面的这个叫做   "product"  类  类里面我们

数据库设计 Step by Step (1)——扬帆启航

引言:一直在从事数据库开发和设计工作,也看了一些书籍,算是略有心得.很久之前就想针 对关系数据库设计进行整理.总结,但因为种种原因迟迟没有动手,主要还是惰性使然.今天也算是痛下决心开始这项卓绝又令我兴奋的工作.这将是一个系列的文 章,我将以讲座式的口吻展开讨论(个人偷懒,这里的总结直接拿去公司培训新人用). 系列的第一讲我们先来回答下面几个问题 数据库是大楼的根基 大多数程序员都很急切,在了解基本需求之后希望很快的进入到编码阶段(可能只有产出代码才能反映工作量),对于数据库设计思考得比较少. 这

数据库设计 Step by Step (2)——数据库生命周期

引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整,需要花很多时间整理.思考数据库设计的各种资料,所以文章的更新速度可能会慢一些,也希望大家能够谅解. 系列的第二讲我们将站在高处俯瞰一下数据库的生命周期,了解数据库设计的整体流程 数据库生命周期 大家对软件生命周期较为熟悉,数据库也有其生命周期,如下图所示. 图(1)数据库生命周期 数据库的生命周期

搭建你的持续集成server - CruiseControl step by step(1)

CruiseControl是CIserver的老者,诞生已是多年,在很多方面,CruiseControlserver已经成为持续集成实践的同义词.而如今,CruiseControl已发展成为一个家族式系统,包含CruiseControl.java.CruiseControl.net.CruiseControl.ruby等适应不同语言环境的实现,其强大的插件和扩展能力也是诸多同类系统无法比你的.而在这里,我仅仅介绍该家族的本家CruiseControl.java,即CruiseControl.Cr

精通initramfs构建step by step

http://hi.baidu.com/jonathan2004/blog/item/db7bf38aad11759ea4c2721d.html 精通initramfs构建step by step (1)--hello world 2009-12-08 19:19 一.initramfs是什么 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统, 然后内核检查rootfs中是否包含有init文件,如果有则

Step By Step(Lua目录)

Step By Step(Lua开篇)http://www.cnblogs.com/stephen-liu74/archive/2012/03/17/2403210.html一.简介二.主要优势三.应用场景 Step By Step(Lua基础知识)http://www.cnblogs.com/stephen-liu74/archive/2012/03/20/2407507.html一.基础知识二.类型与值 Step By Step(Lua表达式和语句)http://www.cnblogs.co