1.限定类似名称隐藏的成员

  1. public Employee(string name, string alias)
  2. {
  3. // Use this to qualify the fields, name and alias:
  4. this.name = name;
  5. this.alias = alias;
  6. }

2.将对象作为参数传递给方法

  1. CalcTax(this);

3.声明索引器

静态成员函数,因为它们存在于类级别且不属于对象,不具有 this 指针。 在静态方法中引用 this 是错误的。

  1. public int this[int param]
  2. {
  3. get { return array[param]; }
  4. set { array[param] = value; }
  5. }

4.实现扩展的方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C#编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显区别。

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

扩展方法必须在非泛型静态类中定义。

      如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。

  1. namespace ExtensionMethods
  2. {
  3. public static class MyExtensions
  4. {
  5. public static int WordCount(this String str)
  6. {
  7. return str.Split(new char[] { ' ', '.', '?' },
  8. StringSplitOptions.RemoveEmptyEntries).Length;
  9. }
  10. }
  11. }

可使用 WordCount 指令将 using 扩展方法置于范围中;

  1. using ExtensionMethods;

而且,可以使用以下语法从应用程序中调用该扩展方法:

  1. string s = "Hello Extension Methods";
  2. int i = s.WordCount();

5.使用扩展方法扩展类或接口

可以使用扩展方法来扩展类或接口,但不能重写扩展方法。 与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。 编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。换句话说,如果某个类型具有一个名为 Process(int i) 的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。 当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。 如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。

定义接口:

  1. public interface IMyInterface
  2. {
  3. void MethodB();
  4. }

定义扩展方法:

  1. public static class ExtensionInterface
  2. {
  3. public static void MethodA(this IMyInterface myInterface,int i)
  4. {
  5. Console.WriteLine
  6. ("Extension.MethodA(this IMyInterface myInterface, int i)");
  7. }
  8. public static void MethodA(this IMyInterface myInterface, string s)
  9. {
  10. Console.WriteLine
  11. ("Extension.MethodA(this IMyInterface myInterface, string s)");
  12. }
  13. // This method is never called in ExtensionMethodsDemo1, because each
  14. // of the three classes A, B, and C implements a method named MethodB
  15. // that has a matching signature.
  16. public static void MethodB(this IMyInterface myInterface)
  17. {
  18. Console.WriteLine
  19. ("Extension.MethodB(this IMyInterface myInterface)");
  20. }
  21. }

实现接口:

  1. class A : IMyInterface
  2. {
  3. public void MethodB() { Console.WriteLine("A.MethodB()"); }
  4. }
  5.  
  6. class B : IMyInterface
  7. {
  8. public void MethodB() { Console.WriteLine("B.MethodB()"); }
  9. public void MethodA(int i) { Console.WriteLine("B.MethodA(int i)"); }
  10. }
  11.  
  12. class C : IMyInterface
  13. {
  14. public void MethodB() { Console.WriteLine("C.MethodB()"); }
  15. public void MethodA(object obj)
  16. {
  17. Console.WriteLine("C.MethodA(object obj)");
  18. }
  19. }

测试接口扩展:

  1. static void Main(string[] args)
  2. {
  3. // Declare an instance of class A, class B, and class C.
  4. A a = new A();
  5. B b = new B();
  6. C c = new C();
  7.  
  8. // For a, b, and c, call the following methods:
  9. // -- MethodA with an int argument
  10. // -- MethodA with a string argument
  11. // -- MethodB with no argument.
  12.  
  13. // A contains no MethodA, so each call to MethodA resolves to
  14. // the extension method that has a matching signature.
  15. a.MethodA(); // Extension.MethodA(IMyInterface, int)
  16. a.MethodA("hello"); // Extension.MethodA(IMyInterface, string)
  17.  
  18. // A has a method that matches the signature of the following call
  19. // to MethodB.
  20. a.MethodB(); // A.MethodB()
  21.  
  22. // B has methods that match the signatures of the following
  23. // method calls.
  24. b.MethodA(); // B.MethodA(int)
  25. b.MethodB(); // B.MethodB()
  26.  
  27. // B has no matching method for the following call, but
  28. // class Extension does.
  29. b.MethodA("hello"); // Extension.MethodA(IMyInterface, string)
  30.  
  31. // C contains an instance method that matches each of the following
  32. // method calls.
  33. c.MethodA(); // C.MethodA(object)
  34. c.MethodA("hello"); // C.MethodA(object)
  35. c.MethodB(); // C.MethodB()
  36.  
  37. Console.ReadLine();
  38. }

6.转自

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/this

.NET基础之this关键字的更多相关文章

  1. Java SE 基础:常用关键字

    Java SE 基础:常用关键字 常用关键字表

  2. Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)

    Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...

  3. JAVA_SE基础——6.标识符&关键字

    学会写helloworld之后,  我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...

  4. Java基础-标识符与关键字

    Java基础-标识符与关键字 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是标识符 标识符就是程序员在编写程序时,给类,变量,方法等起的名字. 二.标识符的命名规则 1& ...

  5. java学习第02天(语言基础组成:关键字、标识符、注释、常量和变量)

    Java语言基础组成 1. 关键字 就是指的一些单词,这些单词被赋予了特殊的java含义,就不再叫单词了. 例如: class Demo{ public static void main(String ...

  6. Java编程基础——标识符和关键字

    Java编程基础——标识符和关键字 摘要:本文主要介绍标识符和关键字. 标识符 是什么 Java语言中,为各种变量.方法.类和包等起的名字,统统称之为Java标识符. 命名规则 ◆ 应以字母.下划线. ...

  7. Java基础语法(1)-关键字与保留字

    title: Java基础语法(1)-关键字与保留字 blog: CSDN data: Java学习路线及视频 1.关键字 关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义,用 ...

  8. java多线程基础(synchronize关键字)

    [toc] 基础知识 ---- 线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(threa ...

  9. Java基础系列--static关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...

  10. -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义

    Java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 关键字 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class ...

随机推荐

  1. 在ServiceModel客户端配置部分中,找不到引用协定“”的默认终结点元素

    鄙人自己写了一个读取文件的ASP.NET服务,在Silverlight工程中添加服务引用(名字为FileIOService)后,出现了如上的错误. 出错原因:服务是在项目B中调用的,但是主项目是A,所 ...

  2. 基于DSP的IS95正向业务信道模块设计

    **定时20ms循环处理话音数据包*** *伪指令不占空间不影响执行速度,只是定义和描述但对汇编链接有重要指示作用 ********************************* .title & ...

  3. SSH免费登录

    SSH免费登录很简单,如果有用过git的就更简单了 只需要一下两步操作就OK: 1.生成公钥和私钥,在linx上生成公钥和私钥,执行:ssh-keygen 2.执行ssh-copy-id +ip 例如 ...

  4. 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例

    main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspac ...

  5. [C++]2-5 分数化小数

    /* 分数化小数 输入正整数a,b,c,输出a/b的小数形式.精确到小数点后C位.a,b<=10^6,c<=10^6. 输入包含多组数据,结束标记为a=b=c=0 样例输入: 1 6 4 ...

  6. 用PHP来获取access_token

    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".A ...

  7. jmeter(五)几种不同的content-type方式

    今天我们来讲3种常见的content-type方式,及jmeter应用时信息头和传参方式的不同: 参照博客http://www.cnblogs.com/imyalost/p/6726795.html ...

  8. bash 文件名操作 常用方法

    参考链接: http://www.jb51.net/article/51592.htm 查找文件不获取路径: find $1 -name '*.bin' -exec basename {} \;

  9. Python 13 简单项目-堡垒机

    本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...

  10. mysql 查询优化 ~ 优化基础补充

    一 简介:此文章是对于 sql通用基础的补充说明 二 虚拟列: mysql虚拟列是mysql5.7的新特性,对于函数计算形成的结果可作为虚拟列,并可以对虚拟列添加索引,这样就能加速sql的运行,不过有 ...