学习系列之扩展方法

一 扩展方法的定义

扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异

从字面上按照我们通常的理解,我们首先需要获得某个类的源代码,然后在这个类代码中增加成员方法,这样就可以达到为一个类提供扩展方法的目的。可是不幸地是,这种方法在没有源代码的情况下就无法奏效了,而且我们人为地去改变源代码有可能会破坏整个代码的稳定性。那么有没有一种方法能在不改变源代码的前提下为某个类提供扩展方法呢?这就是我们今天要说的扩展方法,所以我们可以将扩展方法理解为在不改变源代码的前提下向外部提供扩展方法的一种方式

二 扩展方法的特点

1、实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关

2、实现扩展方法的类方法必须是静态方法;

3、实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类

三 代码演示

(一)扩展c#自身存在的类

我们知道将一个合法字符串类型转换为整型,可以使用int.parse()方法,假如我们希望为string类型扩展一个ToInt方法应该怎么办呢?我们一起来看下面的这段代码:

namespace 扩展方法
{
    /// <summary>
    /// 1、定义一个静态类
    /// 2、静态类的名称和要实现扩展方法的具体类无关
    /// </summary>
    public static class SomeClass
    {
        /// <summary>
        /// 3、实现一个具体的静态方法
        /// </summary>
        /// <param name="str">4、第一个参数必须使用this关键字指定要使用扩展方法的类型</param>
        /// <returns></returns>
        public static int ToInt(this String str)
        {
            return int.Parse(str);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {   

            string strOne = "123";
            int num = strOne.ToInt();
            Console.WriteLine(num);
            Console.ReadLine();
        }
    }
}

(二)扩展自定义类

自身定义一个MyData类,其中包含一个构造函数和一个求三个数字和的方法,如果我们想在此类中添加一个求三个数字平均值的函数,会怎么做?继续在此类中添加?如果这个类是密封的怎么办?那么这个时候我们就可以使用扩展方法对MyData类进行扩展,以方便我们的进一步需求。

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

    /// <summary>
    /// 扩展MyData类,为此类扩展一个求平均值的方法
    /// </summary>
    static class ExtendMyData
    {
        public static double Average(this MyData md)
        {
            return md.sum() / 3;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyData md = new MyData(3, 4, 5);//调用MyData类中的构造函数为对象md赋值
            Console.WriteLine("和为{0}",md.Average());
            Console.ReadLine();
        }
    }
时间: 2024-10-19 16:53:48

学习系列之扩展方法的相关文章

MVC学习系列——ModelBinder扩展

在MVC系统中,我们接受数据,运用的是ModelBinder 的技术. MVC学习系列——ActionResult扩展在这个系列中,我们自定义了XmlResult的返回结果. 那么是不是意味着能POST一个XML数据类型给我们项目,这样的话,我们需要自定义一个XmlModelBinder来接受XML数据. 新建XmlModelBinder,继承于:IModelBinder 1 public class XmlModelBinder : IModelBinder 2 { 3 public obje

pandas.DataFrame学习系列2——函数方法(1)

DataFrame类具有很多方法,下面做用法的介绍和举例. pandas.DataFrame学习系列2--函数方法(1) 1.abs(),返回DataFrame每个数值的绝对值,前提是所有元素均为数值型 1 import pandas as pd 2 import numpy as np 3 4 df=pd.read_excel('南京银行.xlsx',index_col='Date') 5 df1=df[:5] 6 df1.iat[0,1]=-df1.iat[0,1] 7 df1 8 Open

MVC学习系列——Filter扩展

在MVC中,Filter也是可以扩展的.在此,本人对Filter的理解就是AOP,不知道各位大侠,有什么高的见解,呵呵... 首先MVC四大过滤神器IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter. 在此之前,我们先安装Log4net日志神器: 看下项目的引用 配置文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <confi

JavaScript学习总结(十四)——JavaScript编写类的扩展方法

在?J?a?v?a?S?c?r?i?p?t?中?可以使?用?类的p?r?o?t?o?t?y?p?e属性来?扩?展?类的属?性?和?方?法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性. 一.扩展JavaScript内置类,添加动态方法 语法格式: 类名.prototype.方法名 = function([param1],[param2],.

Linq之扩展方法

目录 写在前面 系列文章 扩展方法 总结 写在前面 上篇文章介绍了隐式类型,自动属性,初始化器,匿名类的相关概念,及通过反编译的方式查看了编译器帮我们做了那些事.本篇文章将介绍扩展方法的知识点,及如何定义,如何使用的相关内容. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 Linq之隐式类型.自动属性.初始化器.匿名类 扩展方法 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像

扩展方法以及LinQ的学习

我们今天学习的内容其实还是蛮多的,学习了自动属性,扩展方法,复习初始化器,以及LinQ的一些方法,其实感觉有些还是很熟悉的,在前面的学习过程中有时间感觉学习的知识知道了怎么使用,但是还没有在项目中使用,做的习题似乎意义不大,现在依旧如此,感觉仅限于知道怎样使用.很想做一个小小的项目来熟悉下学习的知识...下面就总结下今天学习的内容. 一.自动属性 private int productid; public int Productid { get { return productid; } set

《PHP扩展学习系列》系列技术文章整理收藏

<PHP扩展学习系列>系列技术文章整理收藏 1PHP扩展之文本处理(二)--PCRE正则表达式语法10--后向引用http://www.lai18.com/content/321526.html 2PHP扩展之文本处理(二)--PCRE正则表达式语法9--重复/量词http://www.lai18.com/content/321525.html 3PHP扩展之文本处理(二)--PCRE正则表达式语法11--断言http://www.lai18.com/content/321527.html 4

【开源】OSharp框架解说系列(3):扩展方法

〇.前言 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable 和 System.Collections.Generic.

C#学习笔记(八):扩展方法

还记得第一次使用DOTween时,发现缓动方法竟然是可以直接用Transform对象中调用到,当时就被震撼到了(那是还是C#小白一只).好了不多说了,今天来学习一下C#的这个特性——扩展方法. 扩展方法简介 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 这样我们可以方便的扩展对象方法而无需使用继承,同时也可以给密封类添加方法. 我们来看一个例子: 1 using System; 2 3 namespace Study 4 { 5 class