• 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);
                    }
                }


  • 相关阅读:
    34.2 字节流 InputStreamReader OutputStreamWriter
    34.1 字符流-- FileRead FileWrite
    34 io流-- 打印流和对象流
    33.3 删除指定的目录(包含子目录)
    33.2 案例:输出指定目录下的所有java文件名(包含子目录)
    33.1 File 获取目录下的所有文件及子目录
    33 File 文件及目录操作
    32 递归
    31.3 自定义异常类 MyException
    31.2 try finally使用
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3247923.html
Copyright © 2020-2023  润新知