脚踏实地学C#5-扩展方法
扩展方法(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-扩展方法的更多相关文章
- 脚踏实地学C#2-引用类型和值类型
引用类型和值类型介绍 CLR支持两种类型,引用类型和值类型两种基本的类型: 值类型下有int.double.枚举等类型同时也可以称为结构,如int结构类型.double结构类型,所有的值类型都是隐式密 ...
- 脚踏实地学C#4-静态类
起因 问:静态类可以实现接口及继承? 答:都不可以 思考:为什么不可以呢? 学习 静态类,有时我们又称为工具类(密封抽象类),从MSDN文档没有直接静态类的定义,这里只能说用static(不能用于结构 ...
- 脚踏实地学C#3-装箱和拆箱
装箱:一种接受值类型的值,根据这个值在堆中创建一个完整的引用类型对象并返回对象的引用(堆地址)的隐式转换 int i_number = 2; //在栈中声明int类型i_Number变量并初始化 ob ...
- 脚踏实地学C#1-基元类型
基元类型:编译器直接支持的数据类型 基元类型直接映射到FCL类库上,如int 和Int32是等价的,只不过是int是c#提供的,Int32是FCL类库提供的. int只是Int32的别名 using ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...
- C#的扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
- 扩展方法(C#)
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 下面的示例为String添加 ...
随机推荐
- docker 如何清理垃圾呢
应用容器在宿主机上长期运行,应用实例启停容器,会产生大量的停止的容器,无容器使用的数据卷.网络配置,无容器依赖的镜像,这些垃圾日积月累,会影响到宿主机的运行状态,造成机子卡顿等现象.因此,需要对这些宿 ...
- Cocos2d-x学习笔记(18)(TestCpp源代码分析-2)
本章主要讲controller.h/cpp文件的分析,该文件主要用于演示样例场景管理类TestController,用于显示全部演示样例的菜单. //controller.cpp #include & ...
- java中Volatile修饰符的含义
在java语言中:为了获得最佳速度,同意线程保存共享成员变量的私有拷贝.并且仅仅当线程进入或者离开同步代码块时才与共享成员变量的原始值进行对照. volatilekeyword的作用就是提示vm:对于 ...
- Solaris网络基础
划分子网: 把大网缩小为若干个小网.修改子网掩码,划分多个网络. 那么如何确定子网的子网掩码和IP地址? 以上你会发现少了6个IP. Ifconfig e1000g0 down down掉网卡 ...
- 数据结构与算法——AVL树类的C++实现
关于AVL树的简单介绍能够參考:数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额外 ...
- 《C程序猿:从校园到职场》出版预告(4):从“散兵游勇”到“正规部队”
看过电视剧<楚汉传奇>的朋友应该对这个场景还有印象:当刘邦第一次去找项羽帮忙的时候.他们一行人看到了项羽军营是怎样练兵的.想到自己练兵的方法,当时就震惊了."刘家军"就 ...
- python发送post请求上传文件,无法解析上传的文件
前言 近日,在做接口测试时遇到一个奇葩的问题. 使用post请求直接通过接口上传文件,无法识别文件. 遇到的问题 以下是抓包得到的信息: 以上请求是通过Postman直接发送请求的. 在这里可以看到消 ...
- 多媒体开发之编码gop---什么是GOP
所谓GOP,意思是画面组,MPEG格中的帧序列,分为I.P.B三种,如排成IBBPBBPBBPBBPBBP...样式,这种连续的帧图片组合即为GOP(画面群,GROUP OF PICTURE),是MP ...
- Apache/2.4.9启动错误:AH01630: client denied by server configuration
在升级Yii框架1.11->2.0beta时,PHP升级到5.5.顺带升级Apache2.2.x到2.4.9. 把原有vhost配置移植过来,出现Apache启动错误: AH01630: cli ...
- EasyDarwin手机直播是如何实现的快速显示视频的方法
前言 经常有人提到最近比较火的映客直播.花椒直播这种,是如何做到在打开手机直播中的某一个主播房间后,立即就能显示出主播视频,非常非常快,而且延时也比较小,是怎么做到的? 其实,这并不是什么高深的技术, ...