美文网首页
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、扩展方法

    1.定义: 2.定于扩展方法 Personl类的定义 为Person类扩展方法 扩展方法被定义为静态方法,但它们是...

  • Kotlin-面向对象-进阶

    扩展 扩展方法 Kotlin支持扩展方法和扩展属性。语法:被扩展的类/接口名.方法名() 父类不能使用子类的扩展方...

  • 扩展方法

    扩展方法: 扩展方法的类必须声明为static 扩展方法本身也必须声明为static 扩展方法必须包含关键字thi...

  • Swift- Extension

    扩展属性(只能是计算属性) 扩展构造器 扩展方法 通过扩展方法, 可以修改该实例self本身.但是方法前要加 mu...

  • ES6新增特性(二)

    ES6 的内置对象扩展 Array 的扩展方法 一、Array 的扩展方法 1. 扩展运算符(展开语法) 扩展运算...

  • JQuery写拓展

    基础 $.extend()扩展JQuery静态方法,$.fn.extend()扩展JQuery实例方法静态方法: ...

  • [IOS]优化UIButton的点击事件

    调用方法 添加扩展方法

  • kotlin中定义方法

    Kotlin 方法 扩展方法 方法内扩展有效 Lamda方法 最后一个表达式就是 lambda 的结果 方法作为参...

  • 扩展方法

    1.字符串的扩展 codePointAt() 能正确处理四个字节存储的字符,返回一个字符的码点 fromCodeP...

  • Kotlin艺术探索之扩展方法和属性代理

    扩展方法 Kotlin支持扩展方法,扩展方法是个很有意思的东西 还是举个栗子比较直观 比如我们想打印10次“abc...

网友评论

      本文标题:23、扩展方法

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