美文网首页
23、扩展方法

23、扩展方法

作者: Peuimporte | 来源:发表于2021-11-03 08:23 被阅读0次

    1.定义:

      扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
    

    2.定于扩展方法

    Personl类的定义

        public class Person
        {
            public string name;
    
            public override string ToString()
            {
                return this.name;
            }
        }
    

    为Person类扩展方法

        public static class MethedExt
        {
            //扩充不带参数的方法
            public static void SayHellow(this Person obj)
            {
                Console.WriteLine("Say Hellow" + obj.name);
            }
            
            //扩充一个带参数的方法
            public static void ChangeName(this Person obj, string name)
            {
                obj.name = name;
            }
        }
    

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

    3. 调用扩展方法

                Person p1 = new Person();
                p1.name = "asdasd";
                p1.sayHellow();
                p1.ChangeName("张三");
    

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

    定义和调用扩展方法注意点

    • 定义一个静态类以包含扩展方法。
    • 将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。
    • 该方法的第一个参数指定方法所操作的类型;该参数必须以 this修饰符开头。
    • 按照与调用类型上的实例方法一样的方式调用扩展方法。
    • 只能扩展对象类

    4 为接口添加扩展方法

    接口定义

        public interface Interface1
        {
            void test1();
    
        }
    

    为接口扩展方法

         public static class MethedExt
        {
            public static void test2(this Interface1 iter)
            {
                Console.WriteLine("test2");
            }
         }
    

    实现接口中的方法

        public class Person : Interface1
        {
            public string name;
            private int age;
    
            public override string ToString()
            {
                return this.name;
            }
    
            public void test1()
            {
    
            }
        }
    

    调用扩展的接口方法

            static void Main(string[] args)
            {
                Person p1 = new Person();
                p1.name = "asdasd";
                p1.test2();
            }
    

    5、使用注意

    可以使用扩展方法来扩展类或接口,但不能重写扩展方法。
    与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。
    编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。 换句话说,如果某个类型具有一个名为 SayHellow()的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。 当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。 如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。

    牢记一点: 如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。

    6、一点建议:

    通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现。 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。
    在使用扩展方法来扩展你无法更改其源代码的类型时,你需要承受该类型实现中的更改会导致扩展方法失效的风险。

    7、小练习

    int[]扩充一个方法,调用这个方法,可以实现打印数组中的元素

    相关文章

      网友评论

          本文标题:23、扩展方法

          本文链接:https://www.haomeiwen.com/subject/fvtfzltx.html