zoukankan      html  css  js  c++  java
  • C#:方法参数之--扩展方法

    方法的分类有:

    • 静态方法(方法声明中用staic修饰)
    • 实例方法
    • 虚方法(方法声明时用virtual修饰)
    • 重写方法(方法声明时用override修饰)
    • 密封方法(方法声明时用sealed修饰)
    • 抽象方法(方法声明时用abstract修饰)
    • 外部方法(方法声明时用extern修饰)
    • 分部方法(方法声明时用partial修饰)
    • 扩展方法(方法的形参列表中的第一个形参使用this修饰)

    扩展方法:其实是声明在非嵌套、非泛型的静态类中,为实现某种特殊功能,而为该类型追加的静态方法;

    示例:原生的string类,不具有ToInt32()方法,我们通过学习扩展方法,为其声明一个ToInt32()扩展方法

    //第一步:声明一个顶级静态类--这里类名的命名规范一般是 待扩展的目标类型+Extension后缀--如:StringExtension
    static class MyExtension
    {
        //第二步:声明一个带第一个形参带this修饰的静态方法(两步完成对string类型的方法扩展)
    
        /// <summary>
        /// 为strin类型提供扩展方法
        /// </summary>
        /// <param name="strValue">待转换的string类型值</param>
        /// <returns>转换成功后的int类型值</returns>
        public static int ToInt32(this string strValue)
        {
            int rtnValue = 0;
            if (int.TryParse(strValue,out rtnValue))
            {
                return rtnValue;
            }
            return rtnValue;
        }
    }  
    

    在Main方法中调用这个扩展方法---当我们通过string类型实例intStr调出可用的方法列表时,可以通过↑ ↓ 箭头找到我们定义的ToInt32()方法;它有一个不同于其它普通方法的图标
    intStr调用扩展方法

    string intStr = "12";
    var result_value= intStr.ToInt32();
    Console.WriteLine(result_value);//输出:12
    

    示例:原生数组Array类型,不支持"切片"功能,我们通过自定义扩展方法,让数组具有切片功能;

    static class MyExtesion
    {
        /// <summary>
        /// 为strin类型提供扩展方法
        /// </summary>
        /// <param name="strValue">待转换的string类型值</param>
        /// <returns>转换成功后的int类型值</returns>
        public static int ToInt32(this string strValue)
        {
            int rtnValue = 0;
            if (int.TryParse(strValue,out rtnValue))
            {
                return rtnValue;
            }
            return rtnValue;
        }
    
        /// <summary>
        /// 为泛型数组提供扩展方法--切片功能
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="arrs">待切片数组</param>
        /// <param name="index">从arrs的index处开始</param>
        /// <param name="count">截取长度为count的元素</param>
        /// <returns>切片后形成的新数组</returns>
        public static T[] Slice<T>(this T[] arrs, int index, int count)
        {
            T[] rtnArr = null;
            if (index < 0 || count < 0 || arrs == null || arrs.Length - index < count)
            {
                return rtnArr;
            }
            else
            {
                rtnArr = new T[count];
                Array.Copy(arrs, index, rtnArr, 0, count);
                return rtnArr;
            }
        }
    }
    

    在Main方法中调用切片扩展方法

    string[] ssArr = new string[] { "12","33","45","32","87","22"};
    var retult_arr = ssArr.Slice(3,2);
    if (retult_arr!=null)
    {
        foreach (var item in retult_arr)
        {
            Console.WriteLine(item.ToInt32());
        }
    }
    //输出:32 87
    

    扩展方法在开发中使用场景特别广泛,但是要注意尽量不要对object类型进行扩展方法的声明;此外扩展方法在Linq中发挥出了巨大的作用,比如我们使用的lists.Where()就是扩展方法
    以上便是对扩展方法的总结,记录下来,以便以后查阅。

  • 相关阅读:
    浅谈localStorage和sessionStorage的相关用法
    v-for中:key的作用总结
    textarea的placeholder无效问题解决
    6月10日
    6月9日
    6月8日
    6月7日
    6月6日
    10月5日
    6月4日
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/13749234.html
Copyright © 2011-2022 走看看