1)扩展方法是什么?

扩展方法可以在不修改原有类的代码前提下,给类“增加”一个方法。扩展方法虽然属于静态方法,但调用的语法却和对象调用类似。直接用一个例子来演示扩展方法。

1.准备实体类

public class Person
{
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
public int Age { get; set; }
public string Name { get; set; }
}

Person实体类代码

2.准备一个静态类和一个静态方法

public static class MyTest
{
public static void SayHello(this Person per1, string flag)
{
Console.WriteLine("你好,我是{0},年龄{1},{2}", per1.Name, per1.Age, flag);
}
}

3.主函数代码如下

class Program
{
static void Main(string[] args)
{
Person per1 = new Person("per1", );
per1.SayHello("握手");
Console.ReadKey();
}
}

在本次实验里,MyTest静态类里的SayHello()就是扩展方法。定义扩展方法的标准是:第一个参数类型是被扩展的类型,类型前面标注this。扩展方法其实也可以被当成普通的静态方法使用,比如上面的主函数代码修改成如下状况也能正常使用,当然只是强调一下而已,既然已经写成扩展方法,那最好还是当成扩展方法使用才方便:

class Program
{
static void Main(string[] args)
{
Person per1 = new Person("per1", );
MyTest.SayHello(per1, "握手");
Console.ReadKey();
}
}

2)为什么使用扩展方法?

字面意思,就好像给一个类又增加了一个方法。在上面演示中,用Person对象去调用的SayHello()方法就好像是Person类内部的方法,然而这个方法却属于MyTest静态类。或许会觉得很奇怪,为何不直接在Person类内部加一个public void SayHello(string flag)方法就完事。实际上扩展方法的好处在于,对于已经封装好的类,不用再去修改类内部代码便能完成对类扩充一个方法,这提高了对类的扩展性。比如在Winform窗体程序中,对于TextBox的一个对象,要去判断Text属性值是否为a123,直接写一个扩展方法并让这个对象去调用,部分代码如下:

1.在窗体程序上增加一个TextBox文本框,一个Button按钮

2.增加一个静态类

static class Check
{
public static bool CheckTest(this TextBox txt1)
{
return txt1.Text == "a123";
}
}

3.给Button按钮新建单击事件,代码如下

private void button1_Click(object sender, EventArgs e)
{
bool a = textBox1.CheckTest();
MessageBox.Show(a.ToString());
}

4.运行测试

在上面演示中,TextBox类是微软已经封装好的类,但却可以做到在内部添加了一个CheckTest()方法的效果。

3)对于扩展方法的总结

1.扩展方法所在的类必须是静态类,也就是被static修饰的类

2.扩展方法的第一个参数类型是被扩展的类型,类型前面标注this

3.使用扩展方法的代码必须添加对扩展方法所在类的namespace的using

4.扩展方法最终其实还是被编译器处理成普通静态方法的调用了

5.扩展方法由于本质上还是静态方法的调用,所以不能访问类外部访问不了的成员

6.该文章只是对扩展方法的初步理解,网上对于扩展方法的好印象更多来源于Linq的使用。但因为自己对扩展方法接触还不太深,因此说声抱歉。

初识C#扩展方法的更多相关文章

  1. c#扩展方法的理解(一:初识)

    扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中. 扩展方法所在的类也必须被声明为static C#只支持扩展方法,不支持扩展属性.扩展事件等. 扩展方法的第一个参数是要扩展的类型,放 ...

  2. CLR via C#(09)-扩展方法

    对于一些现成的类,如果我们想添加一些新的方法来完善功能,但是不想改变已有的封装,也不想使用派生类,那么该怎么办呢?这里我们可以使用扩展方法. 一见钟情--初识扩展 扩展方法使您能够向现有类型“添加”方 ...

  3. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  4. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  5. 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇

    最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...

  6. C#的扩展方法解析

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...

  7. 扩展方法(C#)

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 下面的示例为String添加 ...

  8. 扩展方法解决LinqToSql Contains超过2100行报错问题

    1.扩展方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  9. C#扩展方法

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法就相当于一个马甲,给一个现有类套上,就可以为这个类添加其他方法了. 马甲必须定义为stati ...

随机推荐

  1. 不可不知的JSON处理库(cJSON)

    ANSI C中的超轻量级JSON解析器 JSON(JavaScript对象表示法)是一种轻量级的数据交换格式.人类易于阅读和书写.机器很容易解析和生成.它基于JavaScript编程语言标准ECMA- ...

  2. Java重置Mysql主键自增长值

    MySql 主键自增重置器(统一处理多个表) resetAutoincrement 是一款基于 Java 开发的程序,其功能为重置 mysql 数据库表的主键自增的值为最近的一个. 介绍 开发背景主要 ...

  3. CentOS8.1操作系下使用通用二进制包安装MySQL8.0(实践整理自MySQL官方)

    写在前的的话: 在IT技术日新月异的今天,老司机也可能在看似熟悉的道路上翻车,甚至是大型翻车现场!自己一个人开车过去翻个车不可怕,可怕的是带着整个团队甚至是整个公司一起翻车山崖下,解决办法就是:新出现 ...

  4. bfs算法总结

    BFS(广度优先搜索) 类似于树的按层遍历 常用实现方法:队列 模板: 注意: 只能用来求解无权图的最短路径问题 队列:用来存储每一层便利得到的节点 标记:对于遍历过的结点,应将其标记,以防重复访问 ...

  5. 异步函数async await在wpf都做了什么?

    首先我们来看一段控制台应用代码: class Program { static async Task Main(string[] args) { System.Console.WriteLine($& ...

  6. javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图

    wjavaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG. ...

  7. Numpy中数据的常用的保存与读取

    保存到文本文件numpy.savetxt()numpy.loadtxt() import numpy as np x= np.arange(0,10,0.1) np.savetxt('save_x', ...

  8. 本地代码提交到远程仓库(git)

    [准备环境] 我没有在Linux搭建gitlab私有云服务器,用的是开源的 gitee托管平台 1.在gitee注册账号 2.本地下载git客户端 [步骤] 1  本地新建1个文件夹  进入文件夹后 ...

  9. 团队进行Alpha冲刺--冲刺总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--冲刺总结 作业正文 如下 其他参 ...

  10. MySql索引要注意的8个事情

    设计好MySql索引可以让你的数据库查询效率大为提高.设计MySql索引的时候,有一些问题需要值得我们注意的: 1,创建MySql索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简 ...