zoukankan      html  css  js  c++  java
  • C#扩展方法

    下面举例说明扩展方法:为StringBuilder添加一个index方法

    新建类:StringBuilderExtension  说明:类必须是静态的,公共的。类的方法中第一个参数需是调用对象对应的类型,并加this(这样就可以点出来了)

     public static  class StringBuilderExtension
        {
          /// <summary>
          /// 扩展方法,用来获取StringBuilder中某个字符的序号
          /// </summary>
          /// <param name="sb"></param>
          /// <param name="value"></param>
          /// <returns></returns>
          public static Int32 IndexOf(this StringBuilder sb,char value)
          {
              for (Int32 index = 0; index < sb.Length; index++)
              {
                  if (sb[index] == value)
                      return index;
              }
              return -1;
            
          }
     
        }
    调用:
       StringBuilder sb = new StringBuilder();
       sb.Append("sfaslfolglg");
       Int32 i= sb.IndexOf('o');这时智能提示也会显示这个方法;

    我们么看看,如果我们用常规的方法写这个函数,怎么写
    /// <summary>
          /// 扩展方法,用来获取StringBuilder中某个字符的序号(不用点的方法)
          /// </summary>
          /// <param name="sb"></param>
          /// <param name="value"></param>
          /// <returns></returns>
          public static Int32 IndexOf( StringBuilder sb, char value)
          {
              for (Int32 index = 0; index < sb.Length; index++)
              {
                  if (sb[index] == value)
                      return index;
              }
              return -1;
     
          }
    这时候我们调用:int i= StringBuilderExtension(sb,'o');
    必须得写出类名,点出其方法,这样麻烦很多。但要是在方法第一参数显示this,就表明调用当前所对象sb.index('o').第一个参数就是sb;
    接下来我们看看为什么可以这样写,为什么VS的智能感感应可以这么快的扑捉到这个扩展方法;


    当我们对一个对象sb做.操作时: sb这个对象首先检查当前类(stringBuilder)或者基类有没有这个扩展方法,再检查有没有任何的静态类定义了一个index方法,他的第一个参数是和当前用于调用方法的那个表达式的
    类型匹配的一个类型,而且这个类型必须用this关键字来标识。

    下面介绍给接口添加扩展方法
      /// <summary>
         /// 为接口类型,写扩展方法
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="collection"></param>
          public static void ShowItem<T>(this IEnumerable<T> collection)
         {
             foreach (var item in collection)
             {
                 Console.WriteLine(item);
             }
         }
    调用:
     new int[] { 1, 5, 4, 56, 234 }.ShowItem();
    

    一段嵌套范型常用的方法
     List<Dictionary<int,string>> list = new List<Dictionary<int,string>>();
                Dictionary<intstring> dic = new Dictionary<intstring>();
                dic.Add(1,"nihoa");
                dic.Add(2,"wobuhao");
                dic.Add(3,"nimeimei");
     
                list.Add(dic) ;
     
                foreach(Dictionary<int,string> item in list)
                {
                    foreach (var singel in item)
                    {
                        Console.WriteLine(singel.Key+":"+singel.Value);
                    }
                }


  • 相关阅读:
    git 提交解决冲突(转载)
    impala系列: 时间函数
    impala系列: 字符串函数
    Impala系列: Impala常用的功能函数
    impala系列:impala特有的操作符
    impala系列: 同步Hive元数据和收集统计信息
    ETL脚本的版本管理方法和 SourceTree 使用
    几本不错的数据仓库和Hadoop书籍
    Kudu系列-基础
    sql parser
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3247923.html
Copyright © 2011-2022 走看看