• C# 扩展方法


    定义:扩展方法允许现存已编译的类型和当前即将被编译的类型在不需要被直接更新的情况下,获得功能上的扩展。

    为类型添加功能但并不拥有类型的已有代码时;

    当需要使类型支持一系列成员但不能改动类型的原始定义时。

    说明:扩展方法不会真正改变编译后的代码,只是在当前应用程序的上下文中为类型增加成员

    一、扩展方法定义

    static class MyExtensions // ①方法定义在静态类
    {
          // ②扩展方法声明为静态的
          public static void DisplayDefiningAssembly (this object obj) // ③使用this关键字对第一个参数修饰
          {
               Console.WriteLine("{0} lives here:=> {1}
    ",obj.GetType().Name,Assembly.GetAssembly(obj.GetType()).GetName().Name);
          }
    
          public static int ReverseDigits(this int i)
          { 
                // 把int翻译为string然后获取所有字符
                char[] digits = i.ToString().ToCharArray();
                // 现在反转数组中的项
                Array.Reverse(digits );
                // 放回string
                String newDigits = new string (digits );
                // 最后以int返回修改后的字符串
                return int.Parse(newDigits)
          }
    }

    1)必须把方法定义在静态类中

    2)每个扩展方法也必须是静态的

    3)所有扩展方法都需要使用this关键字对第一个参数进行修饰(只对第一个参数

    4)每个扩展方法只能被内存中正确的实例调用,或通过其所处的静态类被调用

    二、使用扩展方法

    1)在实例层次上调用扩展方法

    int myInt =123456;
    myInt.DisplayDefiningAssembly();
    
    ... //使用其他类型的实例调用扩展方法

    2)静态调用扩展方法

    int myInt =123456;
    MyExtensions.DisplayDefiningAssembly(myInt);

    说明:

    ①、扩展方法本质上是可以从扩展类型的实例上进行调用的静态方法;只是一种语法糖

    ②、它和普通的方法不一样,扩展方法不能直接访问它们扩展的类型成员。扩展不是继承

    ③、但是我们可以使用this限定的参数来访问要扩展类型的所有公共成员(仅仅是公共成员)

    ④、只有对正确导入了扩展方法所在命名空间,才可以使用扩展方法

    ⑤、扩展方法支持智能感应,以一个向下的箭头代指扩展方法

    三、通过扩展方法扩展接口类型

    需要对扩展的接口的扩展方法做实现定义

    static class MyExtensions
    {
           // 扩展IBase 方法及其实现
           public static int Sub(this IBase b, int x,int y)
           {
                return x-y;
           }
    }
  • 相关阅读:
    模拟退火求二维费马点
    二叉查找树
    Linux中让普通用户拥有超级用户的权限
    python 正则表达式应用——缩写词扩充
    解决单链表中的环问题
    python数学函数
    train,dev,test数据集作用
    朴素贝叶斯法(二)——基本方法
    生成模型与判别模型
    ImportError: cannot import name wordnet
  • 原文地址:https://www.cnblogs.com/senyier/p/6617772.html
Copyright © 2020-2023  润新知