• C# 3.0 新特性扩展方法


    1. 主要目的
      掌握对一个已经编译的类的方法的扩展
    2. 特别注意
      a. 扩展某个类时,新建的类要使用 public static 修饰,因为默认的类是 internal 访问修饰符
      b. 这个类要有文件作用域,即不能作为嵌套类使用
      c. 扩展方法要声明为静态的
      d. 扩展方法的第一个参数类型即是要扩展的类,且该参数前要加 this 关键字
      e. 扩展类的命名很重要,当NET Framework 类库更新时,若更新后的类库中,添加了与你先前自定义的静态扩展类相同的类名,则会隐藏掉自定义的静态扩展类
      f.  为类型A添加扩展方法时,同时也会为类型A的派生类添加该扩展方法,故尽量不要在基类上添加扩展方法,以免造成方法冗余。
    3. 具体实现
      如下代码实现添加一个扩展 object 类的方法,因为 .net 中所有的类都继承自 object 类,故调用时,随意选择了 int 类型
      代码如下:

      代码
      1 publicstaticclass ExtendObject
      2 {
      3 publicstaticvoid ShowTypeInfo(thisobject obj)
      4 {
      5 Console.WriteLine("my datatype is {0}", obj.GetType().Name);
      6 }
      7 }

      调用时的代码如下:
      可以有两种调用方法:一是实例调用,二是扩展类名调用

      代码
      1 class Program
      2 {
      3 staticvoid Main(string[] args)
      4 {
      5 int a =192;
      6 //使用类实例调用静态方法
      7   a.ShowTypeInfo();
      8
      9 //使用静态类名调用静态方法
      10   ExtendObject.ShowTypeInfo(a);
      11 Console.Read();
      12 }
      13 }
       
    4. 现在,我们来分析一下,当编译器碰到代码 a.ShowTypeInfo() 时都做了哪些事:

      首先,它会去检查 System.Int32类中是否有ShowTypeInfo方法的定义,如果有,则调用,如果没有,编译器则会去寻找所有静态类,看是否哪个静态类中有静态方法的第一个参数是Int32类型或者它的基类,并且有 this 关键字修饰。有则调用,无则会报错。

    5. 特别需要注意的是,扩展类与被扩展的类是两个不同的类,故扩展类中的类方法访问被扩展类的成员时,只能访问声明为 public 修饰符的成员。

      代码如下:

      被扩展的类:Bird

    6. class Bird
      {
          
      private string _bType;
          
      public string BType
           {
               
      get;
               
      set;
           }
      }


      扩展类 ExtendBird

      1 public static class ExtendBird
      2 {
      3     public static void SetBirdType(this Bird b, string birdType)
      4     {
      5         //公共属性,可以访问
      6          b.BType = birdType;
      7
      8         //会出现编译错误
      9          _bType = birdType;
      10     }
      11 }
  • 相关阅读:
    Codeforces Gym 100015F Fighting for Triangles 状压DP
    Codeforces Gym 100015B Ball Painting 找规律
    Codeforces Gym 100015A Another Rock-Paper-Scissors Problem 找规律
    Codeforces Gym 100231G Voracious Steve 记忆化搜索
    Codeforces Gym 100231F Solitaire 折半搜索
    Codeforces Gym 100231L Intervals 数位DP
    Codeforces Gym 100231B Intervals 线段树+二分+贪心
    Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何
    Codeforces Round #339 (Div. 2) B. Gena's Code 水题
    Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
  • 原文地址:https://www.cnblogs.com/jiejie_peng/p/1707195.html
Copyright © 2020-2023  润新知