• 让你觉得破坏了封装性的扩展方法


    扩展方法
    源于对扩展方法的了解是来自List<T>的Where、Order、GroupBy等方法的使用,智能感知提示这些方法都是扩展方法,于是MSDN上查阅后总结如下自定义扩展方法(将字符串转换为Int,代码拷贝)

    namespace MyCommon

    {

        public static class EString

        {

            public static int ToInt(this string t)

            {

                int id;

                int.TryParse(t, out id);//这里当转换失败时返回的id为0

                return id;

            }

        }

    }

    微软规定,扩展方法:1、必须是静态类和静态方法(而且必须是public
                                    2
    、参数必须以this作为前缀

    其实咋一看,扩展方法明显违法了封装性的原则,把方法设为public,让外界直接调用,这是很违法封装原则的,但是这里没有办法,如果改为private,外界实例无法访问,但是微软告诉我们,虽然是使用实例方法的语法来调用扩展方法,但是编译器生成的IL中间语言的时候会把代码转换成对静态方法的调用,理论上说并未真正违法封装性的原则,但是这种解释有点牵强。

    我突然发现,该静态类的名称 EString似乎毫无用处,似乎可以随意改动,的确是这样,这里要的只是命名空间和方法名,而方法的第一个参数决定了该扩展方法是用于对何种类型的扩展,例如上面的例子this string t,第一个参数的类型是string,则是对string做的扩展方法

    另外扩展方法的优先级总是比实例本身的方法的优先级低,即如果A类本身有fun1()方法,则另外扩展一个同名的fun1方法,则扩展的fun1,永远不会执行,因为在编译的时候编译器永远不会绑定到该扩展方法


  • 相关阅读:
    改善深层神经网络
    IO操作 第一篇 学习(转载)
    杂谈:收集的一些博文
    杭电2072
    Java数组常用方法
    JAVA中final修饰符小结
    南阳106
    南阳283
    南阳277
    南阳458
  • 原文地址:https://www.cnblogs.com/yinhaichao/p/3253299.html
Copyright © 2020-2023  润新知