C#的扩展方法学习

一,什么是扩展方法?

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

2,扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

3,扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。

4,扩展方法在非嵌套的、非泛型静态类内部定义的

5,在代码中,可以使用实例方法语法调用该扩展方法。 但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。 因此,并未真正违反封装原则。 实际上,扩展方法无法访问它们所扩展的类型中的私有变量。

6,扩展方法是静态方法,则也不能被重写

Extension类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Extensions
{
    //public static class Extension<T>  //提示扩展方法必须在非泛型静态类中定义
    public static class Extension
    {
        public static void MethodStr(this string i)
        {
            Console.WriteLine(i);
        }
    }
}

 

DefineIMyInterface接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DefineIMyInterface
{
    public interface IMyInterface
    {
        void MethodStr();
    }
}

Program调用实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Extensions;
using DefineIMyInterface;

namespace ExtenMethod
{

    class Test : IMyInterface
    {
        public void MethodStr()
        {
            Console.WriteLine("接口实现");
        }
    }
    class Test2
    {
        public void MethodStr()
        {
            Console.WriteLine("类的实现方法");
        }
    }class Program
    {
        private string pri = "2";
        static void Main(string[] args)
        {
            //在编译后,相同签名的方法,扩展方法的优先级总是比类型本身中定义的实例方法低,则实现的是接口和类的方法,
            //以下两个例子中:与接口或类方法具有相同名称和签名的扩展方法永远不会被调用,因为它的名称和签名与这些类已经实现的方法完全匹配。
            //可以使用扩展方法来扩展类或接口,但不能重写扩展方法。 
            Test t = new Test();
            t.MethodStr();

            Test2 t2 = new Test2();
            t2.MethodStr();

            //实现扩展方法
            string extenmethod = "扩展方法实现";
            extenmethod.MethodStr();

            //扩展方法无法访问它们所扩展的类型中的私有变量。
            //在代码中,可以使用实例方法语法调用该扩展方法。但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。因此,并未真正违反封装原则。
            //pri.MethodStr();  //报错
        }
    }

}

 

转载于:https://www.cnblogs.com/May-day/p/6477958.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值