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


  • 相关阅读:
    Linux 内核源码中likely()和unlikely()【转】
    详解likely和unlikely函数【转】
    [arm驱动]Linux内核开发之阻塞非阻塞IO----轮询操作【转】
    Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现【转】
    Linux下的hrtimer高精度定时器【转】
    Linux 高精度定时器hrtimer 使用示例【转】
    Linux 进程等待队列【转】
    【转】【Android】对话框 AlertDialog -- 不错不错
    【转】 CATransform3D 矩阵变换之立方体旋转实现细节
    【转】如何在IOS中使用3D UI
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3247923.html
Copyright © 2011-2022 走看看