具体用法如下:

  1. public static class ClassHelper
  2. {
  3. //用this 声明将要吧这个方法附加到Student对象
  4. public static bool CheckName(this Student stu)
  5. {
  6. if (stu.Name == "小明")
  7. {
  8. return true;
  9. }
  10. else
  11. return false;
  12. }
  13. //为String对象添加一个ChangeString 方法
  14. public static string ChangeString(this String s,string str)
  15. {
  16. return str + ":" + s;
  17. }
  18. }
  19. public class Student
  20. {
  21. public string Name { get; set; }
  22. public void Show()
  23. {
  24. this.CheckName();//Student拥有了CheckName这个方法
  25. }
  26. public void ShowString()
  27. {
  28. string s = "aaa";
  29. s.ChangeString("哈哈");//String拥有了ChangeString这个方法
  30. }
  31. }

这个例子很简单,为自定义的Student类扩展了一个CheckName方法,该方法没有参数,然后又为String系统自带的类 扩展了一个ChangeString 方法,该方法有一个string  类型的参数,注意:扩展方法必须声明为static静态方法,并且放在静态类中。

this不仅可以扩展类方法,还可以扩展接口,使得任何继承自该接口的类都会拥有此扩展方法。这里我们修改上面这个例子:

  1. public static class ClassHelper
  2. {
  3. //用this 声明将要吧这个方法附加到IStudent对象
  4. public static bool CheckName(this IStudent stu)
  5. {
  6. if (stu.Name == "小明")
  7. {
  8. return true;
  9. }
  10. else
  11. return false;
  12. }
  13. //为String对象添加一个ChangeString 方法
  14. public static string ChangeString(this String s, string str)
  15. {
  16. return str + ":" + s;
  17. }
  18. }
  19. public interface IStudent
  20. {
  21. public void Show();
  22. public string Name { get; set; }
  23. }
  24. public class StudentA : IStudent
  25. {
  26. public void Show()
  27. {
  28. this.CheckName();//Student拥有了CheckName这个方法
  29. }
  30. public void ShowString()
  31. {
  32. string s = "aaa";
  33. s.ChangeString("哈哈");//String拥有了ChangeString这个方法
  34. }
  35. }
  36. public class StudentB : IStudent
  37. {
  38. public void Show()
  39. {
  40. this.CheckName();//Student拥有了CheckName这个方法
  41. }
  42. public void ShowString()
  43. {
  44. string s = "aaa";
  45. s.ChangeString("哈哈");//String拥有了ChangeString这个方法
  46. }
  47. }

,注意这个例子的CheckName由this Student 改成了 this IStudent,IStudent 是一个接口,StudentA和StudentB都继承了这个接口,他们都会拥有CheckName这个扩展方法。

显然这样做是有好处的,当第三方提供给你一个DLL,其中包括许多类,由于这些类都是封装在DLL中的,当你想扩展其中某个类的时候,你却不能修改类的源代码。这时候你就可以用this来扩展。。。。

..net 3.5新特性之用this关键字为类添加扩展方法的更多相关文章

  1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法

    本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...

  2. Java8新特性(一)_interface中的static方法和default方法

    什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...

  3. java8新特性:interface中的static方法和default方法

    java8中接口有两个新特性,一个是静态方法,一个是默认方法. static方法 java8中为接口新增了一项功能:定义一个或者多个静态方法. 定义用法和普通的static方法一样: public i ...

  4. Java8新特性之空指针异常的克星Optional类

    Java8新特性系列我们已经介绍了Stream.Lambda表达式.DateTime日期时间处理,最后以"NullPointerException" 的克星Optional类的讲解 ...

  5. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

  6. Java 8新特性(三):Optional类

    在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...

  7. C++11 带来的新特性 (3)—— 关键字noexcept

    1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...

  8. C# 3.0 特性之扩展方法

    今天,我们来聊一聊C#的扩展方法. C# 3.0中为我们提供了一个新的特性—扩展方法.什么是扩展方法呢?我们看一下MSDN的注解: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新 ...

  9. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

随机推荐

  1. elasticsearch全文搜索

    1.创建索引 PUT 192.168.100.102:9200/news 2.创建mapping POST 192.168.100.102:9200/news/new/_mapping { " ...

  2. Oracle报错:“ORA-18008: 无法找到 OUTLN 方案 ”的解决方案

    Oracle报错:“ORA-18008: 无法找到 OUTLN 方案 ”的解决方案   2.修改replication_dependency_tracking参数 SQL> alter syst ...

  3. 转 pygame学习笔记(1)——安装及矩形、圆型画图

    http://www.cnblogs.com/xiaowuyi/archive/2012/06/06/2538921.html

  4. 转 ORA-00054 的解决方法

    统有一个不用的索引,想删除这个索引, SQL> drop index GPSTIME_GLOBAL_INDEX  2  /drop index GPSTIME_GLOBAL_INDEX      ...

  5. 专 linux命令之set x详解

    set -x与set +x指令   用于脚本调试.set是把它下面的命令打印到屏幕 set -x 是开启 set +x是关闭 set -o是查看 (xtrace),set去追中一段代码的显示情况. 执 ...

  6. 工具类学习-java实现邮件发送激活码

    问题:用java实现服务器发送激活码到用户邮件. 步骤一:如果是个人的话,确保在本地安装邮件服务器(易邮服务器)和邮件客户端(foxmail). 步骤二:导入jar包  mail.jar,其他的需要什 ...

  7. poj3368 Frequent values

    思路: 转化为RMQ. 实现: #include <cstdio> #include <cstring> #include <algorithm> using na ...

  8. ES3之bind方法的实现模拟

    扩展Function原型方法,此处用myBind来模拟bind实现 Function.prototype.myBind = function(o /*,args*/){       //闭包无法获取t ...

  9. CCF|打酱油|Java

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...

  10. VM virtualBox设置无缝全屏

    设置之前: