让你觉得破坏了封装性的扩展方法_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 让你觉得破坏了封装性的扩展方法

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

 2013/8/12 18:09:09  殷海超  博客园  我要评论(0)
  • 摘要:扩展方法源于对扩展方法的了解是来自List<T>的Where、Order、GroupBy等方法的使用,智能感知提示这些方法都是扩展方法,于是MSDN上查阅后总结如下自定义扩展方法(将字符串转换为Int,代码拷贝)namespaceMyCommon{publicstaticclassEString{publicstaticintToInt(thisstringt){intid;int.TryParse(t,outid);//这里当转换失败时返回的id为0returnid;}}
  • 标签:方法

扩展方法
源于对扩展方法的了解是来自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,永远不会执行,因为在编译的时候编译器永远不会绑定到该扩展方法


发表评论
用户名: 匿名