博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#学习笔记(八):扩展方法
阅读量:7166 次
发布时间:2019-06-29

本文共 1992 字,大约阅读时间需要 6 分钟。

还记得第一次使用DOTween时,发现缓动方法竟然是可以直接用Transform对象中调用到,当时就被震撼到了(那是还是C#小白一只)。好了不多说了,今天来学习一下C#的这个特性——扩展方法。

扩展方法简介

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

这样我们可以方便的扩展对象方法而无需使用继承,同时也可以给密封类添加方法。

我们来看一个例子:

1 using System; 2  3 namespace Study 4 { 5     class Program 6     { 7         private static void Main(string[] args) 8         { 9             int[] ints = { 10, 45, 15, 39, 21, 26 };10             var result = ints.OrderBy(g => g);11             foreach (var i in result)12             {13                 System.Console.Write(i + " ");14             }15 16             Console.Read();17         }18     }19 }

上面的代码会报错:找不到OrderBy方法,因为int类型的数组就没有这个方法。如果我们导入Linq的包后就可以使用了,如下:

using System.Linq;

原因就是OrderBy是Linq提供的一个扩展方法,是我们可以任意的添加指定类的公共方法。

扩展方法编写

我们要添加一个扩展方法,需要添加一个静态类,如下我们添加一个扩展string的方法,通过该方法我们可以获取字符串的单词数量。

1 using System; 2  3 namespace Study 4 { 5     class Program 6     { 7         private static void Main(string[] args) 8         { 9             string str = "Hi! My name is LiLei!";10             Console.WriteLine(str.WordCount());11 12             Console.Read();13         }14     }15 16     public static class MyExtensions17     {18         public static int WordCount(this String str)19         {20             return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;21         }22     }23 }

运行程序输出“5”。

扩展方法编写要点

  1. 扩展方法必须在一个非嵌套、非泛型的静态类中定义;
  2. 必须有一个以this关键字加上类型的参数,该参数表示扩展该类型的方法,同时将该类型的值作为参数传递进来;
  3. 第一个参数不能使用out和ref修饰符;
  4. 第一个参数不能为指针类型;

空引用也可以调用扩展方法

我们都知道一个为空的对象调用任何方法都会抛出空指针异常,但是如果使用扩展方法却不会这样,如下:

1 using System; 2  3 namespace Study 4 { 5     class Program 6     { 7         private static void Main(string[] args) 8         { 9             string str = null;10             Console.WriteLine(str.IsNull());11 12             Console.Read();13         }14     }15 16     public static class MyExtensions17     {18         public static bool IsNull(this object obj)19         {20             return obj == null;21         }22     }23 }

运行会返回“True”。

转载地址:http://csmwm.baihongyu.com/

你可能感兴趣的文章
银河麒麟操作系统上配置Bond(二)使用ifenslave方式
查看>>
Python高阶函数
查看>>
Xen虚拟化
查看>>
spring 数据连接池
查看>>
免软驱 安装 windows server 2003 RAID驱动 -GenerateDriverDiskISO
查看>>
tomcat 配置 字符串UTF-8 支持中文请求路径
查看>>
jstl jsp 计算相加
查看>>
spring junit使用疑问
查看>>
Protostar format2
查看>>
WEB 组件开发相关记录
查看>>
【Eclipse】 类似syso快捷键补全代码的自定义
查看>>
JS 实现一次下载多个文件
查看>>
删除osd步骤
查看>>
我的友情链接
查看>>
为EditText设置OnTouchListener事件监听
查看>>
ORA-15064 tips
查看>>
marathon-lb使用实践
查看>>
九、RabbitMQ的集群安装
查看>>
Linux( rhel-server-7.0-x86_64)安装Oracle Database 12c Release 1
查看>>
解决:Word遇到问题需要关闭
查看>>