扩展方法(Extension Method)

MSDN定义:能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

扩展方法须知: 1、扩展方法声明所在的类必须被声明为static

2、扩展方法必须被声明为static

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

创建扩展方法

//通过扩展方法 创建一个类似List FindAll方法
namespace Blog_ExtensonMethod
{
//静态类
public static class ExtensionMethods
{ //声明一个委托(本次不是重点,后面介绍委托和事件)
public delegate bool MyCalcDelegate<in T>(T obj);
//静态方法
//第一版本
public static List<T> ScreenValueList<T>(this List<T> list, MyCalcDelegate<T> myCalc) //this关键字 后跟类型
{
List<T> reslut = new List<T>();
foreach (var item in list)
{
if (myCalc(item))
{
reslut.Add(item);
}
}
return reslut;
}
//第二版本
public static List<T> ScreenValue<T>(this List<T> list, Func<T, bool> whereLambda)
{
return list.Where(whereLambda).ToList();
}
}
}
namespace Blog_ExtensonMethod
{
class Program
{
static void Main(string[] args)
{
//list初始化数据
List<int> list = new List<int>();
for (int i = 0; i < 100; i++)
{
list.Add(i);
} //ScreenValueList(筛选数据)创建步骤
//1.创建扩展方法(静态类、静态方法、this关键字+类型)
//1.1 创建一个委托(委托可以简单理解将方法像参数一样可以进行传递)
//2.方法内 创建一个新的泛型List
//3.方法内 将MyCalc方法(判断list中的单个值是否大于50,如果大于就添加到新的泛型List中)
//4.方法内 将新的泛型List返回 //第一版本
var temp = list.ScreenValueList(MyCalc); //将MyCalc方法传入ScreenValueList方法中返回List循环打印
foreach (var item in temp)
{
Console.WriteLine(item);
} Console.WriteLine("======================="); //第二版本 和FindAll差不多了
var tmp = list.ScreenValue(i => i > 50);
foreach (var item in tmp)
{
Console.WriteLine(item);
}
Console.ReadKey();
} public static bool MyCalc(int val)
{
return val > 50;
}
}
}                               

其实很多的时候我们都在用扩展方法,只是没认真注意,如Linq中的方法,Where、OrderBy等,犹如MVC中HtmlHelper添加符合我们方法,那绝对是堪比服务端控件的利器,而又没有viewstate!

扩展方法其实只要记得三要素:静态类、静态方法、this关键字

脚踏实地学C#5-扩展方法的更多相关文章

  1. 脚踏实地学C#2-引用类型和值类型

    引用类型和值类型介绍 CLR支持两种类型,引用类型和值类型两种基本的类型: 值类型下有int.double.枚举等类型同时也可以称为结构,如int结构类型.double结构类型,所有的值类型都是隐式密 ...

  2. 脚踏实地学C#4-静态类

    起因 问:静态类可以实现接口及继承? 答:都不可以 思考:为什么不可以呢? 学习 静态类,有时我们又称为工具类(密封抽象类),从MSDN文档没有直接静态类的定义,这里只能说用static(不能用于结构 ...

  3. 脚踏实地学C#3-装箱和拆箱

    装箱:一种接受值类型的值,根据这个值在堆中创建一个完整的引用类型对象并返回对象的引用(堆地址)的隐式转换 int i_number = 2; //在栈中声明int类型i_Number变量并初始化 ob ...

  4. 脚踏实地学C#1-基元类型

    基元类型:编译器直接支持的数据类型 基元类型直接映射到FCL类库上,如int 和Int32是等价的,只不过是int是c#提供的,Int32是FCL类库提供的. int只是Int32的别名 using ...

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

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

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

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

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

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

  8. C#的扩展方法解析

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

  9. 扩展方法(C#)

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

随机推荐

  1. indy9在程序关闭时出现terminate thread timeout的BUG解决办法

    indy9在程序关闭时出现terminate thread timeout的BUG解决办法 INDY9线程有BUG,在退出程序的时候会报错:terminate thread timeout(终止线程超 ...

  2. 【swagger】2.swagger提供开发者文档--返回统一格式篇【spring mvc】【spring boot】

    接着上一篇来说, 不管正常返回结果还是后台出现异常,应该返回给前台统一的响应格式. 所以这一篇就为了应对解决这个问题. ======================================== ...

  3. poj-3744-Scout YYF I-矩阵乘法

    f[i]=f[i-1]*p+f[i-2]*(1-p); 正好能够用矩阵加速. . . . #include<stdio.h> #include<string.h> #inclu ...

  4. 初涉IPC,了解AIDL的工作原理及用法

    初涉IPC,了解AIDL的工作原理及用法 今天来讲讲AIDL.这个神奇的AIDL,也是近期在学习的,看了某课大神的解说写下的blog,希望结合自己的看法给各位同价通俗易懂的解说 官方文档:http:/ ...

  5. andrid对不能导入的类,知道类路径怎样使用该类

    andrid对不能导入的类,知道类路径怎样使用该类?使用java的反射机制. 下边是一个样例. MTK平台对Android源生的Telephone接口进行了扩展,加入了一个TelephonyManag ...

  6. 移动端底部input被弹出的键盘遮挡

    https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView 移动端input被键盘遮挡,事件是跳到可视区域! doc ...

  7. Balanced Binary Tree——数是否是平衡,即任意节点左右字数高度差不超过1

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  8. ubuntu boot空间不足

    在安装 Ubuntu的时候 , 给/boot文件目录分配空间的时候,是100M,/boot可以单独分成一个区,也可以不单独分,在/(根目录)下也会自动为其创建一个boot目录.顺便提一下,Linux分 ...

  9. Eoeclient源代码分析---SlidingMenu的使用

    Eoeclient源代码分析及代码凝视 使用滑动菜单SlidingMenu,单击滑动菜单的不同选项,能够通过ViewPager和PagerIndicator显示相应的数据内容. 0  BaseSlid ...

  10. UE-9260使用说明2

    生成镜像 1. U-boot 生成u-boot.bin文件 (1) Makefile ifeq ($(ARCH),arm) CROSS_COMPILE = endif 改动为 ifeq ($(ARCH ...