zoukankan      html  css  js  c++  java
  • c#扩展方法的理解(一:初识)

    扩展方法是静态方法,是类的一部分,但是实际上没有放在类的源代码中。

    扩展方法所在的类也必须被声明为static

    C#只支持扩展方法,不支持扩展属性、扩展事件等。

    扩展方法的第一个参数是要扩展的类型,放在this关键字的后面,告诉编译期这个方法是Money类型的一部分。

    在扩展方法中,可以访问扩展类型的所有公共方法和属性。

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

    这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码。

    先做个例子吧,以String为例,需要在字符串类型中加一个从字符串转为数值的功能。

    以往我们可能是这样做的,会专门写一个方法做过转换

    public static int StrToInt(string s)
    {
        int id;
        int.TryParse(s, out id);//这里当转换失败时返回的id为0
        return id;
    }

    调用就使用

    string s = "abc";
    int i = StrToInt(s);

    若是String类型有一个名为ToInt()(从字符串转为数值)的方法,就可以这样调用了

    string s = "abc";
    int i = s.ToInt();

    这样看起来是不是更好,下面来看看具体怎么实现吧

    第一步:

    我先创建一个解决方案,一个web应用程序(webtest)及一个类库(W.Common)

    在webtest项目添加引用W.Common项目

    第二步:在类库中新建一个名为EString.cs类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace W.Common
    {
        public static class EString
        {
            /// <summary>
            /// 将字符串转换为Int
            /// </summary>
            /// <param name="t"></param>
            /// <returns>当转换失败时返回0</returns>
            public static int ToInt(this string t)
            {
                int id;
                int.TryParse(t, out id);//这里当转换失败时返回的id为0
                return id;
            }
        }
    }

    看了上面的代码了吧,扩展方法规定类必须是一个静态类,EString是一个静态类,里面包含的所有方法都必须是静态方法。

    msdn是这样规定扩展方法的:“扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

    EString里有一个ToInt的静态方法,他接收一个自身参数this,类型为string,this string必须在方法参数的第一个位置。

    这句话什么意思,即你需要对string扩展一个ToInt方法,this是string实例化后的对象,这可能说的不太清楚,我的表述能力能弱,不要见怪呀。。。通俗的说就是,扩展方法跟静态类的名称无关,只需要在一个静态类里面定义一个静态方法,第一个参数必须this string开头。

    如果需要你要对DateTime类型扩展方法名为IsRange(判断是否在此时间范围内),代码如下:

    /// <summary>
       /// 此时间是否在此范围内 -1:小于开始时间 0:在开始与结束时间范围内 1:已超出结束时间
       /// </summary>
       /// <param name="t"></param>
       /// <param name="startTime"></param>
       /// <param name="endTime"></param>
       /// <returns></returns>
       public static int IsRange(this DateTime t, DateTime startTime, DateTime endTime)
       {
           if (((startTime - t).TotalSeconds > 0))
           {
               return -1;
           }
     
           if (((endTime - t).TotalSeconds < 0))
           {
               return 1;
           }
     
           return 0;
       }

    这里的扩展方法是用this DateTime打头,那么就可以这样调用

    time.IsRange(t1,t2);//判断时间time是否在t1到t2的范围内

    当前代码在使用扩展方法前需要先引用命名空间

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using W.Common;//这里引用扩展方法所在的命名空间
     
    namespace webtest
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                use1();
                Response.Write("<br />");
                use2();
            }
     
            /// <summary>
            /// 没有用扩展方法
            /// </summary>
            private void use1()
            {
                string s = "abc";
                int i = StrToInt(s);
                Response.Write("没有用扩展方法:" + i);
            }
     
            /// <summary>
            /// 使用扩展方法
            /// </summary>
            private void use2()
            {
                string s = "2012";
                int i = s.ToInt();
                Response.Write("使用扩展方法:" + i);
            }
     
            public static int StrToInt(string s)
            {
                int id;
                int.TryParse(s, out id);//这里当转换失败时返回的id为0
                return id;
            }
        }
    }

     

    第二个案例:——————————————————————————————————————

    class Program
        {
            static void Main(string[] args)
            {
                Money cash = new Money();
                cash.Amount = 40M;
                cash.AddToAmount(10M);
                Console.WriteLine("cash.ToString() returns: " + cash.ToString());
                Console.ReadLine();
            }
        }
    
        public class Money
        {
            private decimal amount;
            public decimal Amount
            {
                get
                {
                    return amount;
                }
                set
                {
                    amount = value;
                }
            }
            public override string ToString()
            {
                return "$" + Amount.ToString();
            }
        }
    
        public static class MoneyExtension
        {
            public static void AddToAmount(this Money money, decimal amountToAdd)
            {
                money.Amount += amountToAdd;
            }
        }
  • 相关阅读:
    85--spring cloud (Ribbon-Eureka注册中心)
    85--spring cloud 入门(springcloud简介)
    84--spring cloud 入门(微服务注册中心介绍)
    83--spring cloud 入门(Eureka注册中心)
    82--JT项目20(订单模块实现/ThreadLocal本地线程变量/Quartz框架)
    81--JT项目19(商品购物车/详情/用户退出)
    80--JT项目18(Dubbo负载均衡/单点登录/注册业务)
    Ajax中post与get的区别
    Process
    Java实现CURL,与把字符串结果写到json文件
  • 原文地址:https://www.cnblogs.com/zmztya/p/5362461.html
Copyright © 2011-2022 走看看