zoukankan      html  css  js  c++  java
  • 让你觉得破坏了封装性的扩展方法

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


  • 相关阅读:
    C#驱动mysql明明数值不为空却一直说DBNull.Value的诡异情况
    WinForm解决UI假死
    js实现的简单遮罩层
    mongodb C#连接报错 Invalid credentials for database 'admin'
    c#记录代码运行的耗时。
    C# LINQ
    timeScale减速对动画影响的处理方法(转)
    委托
    Unity3D单例类模板类
    Unity协程(Coroutine)管理类——TaskManager工具分享(转)
  • 原文地址:https://www.cnblogs.com/yinhaichao/p/3253299.html
Copyright © 2011-2022 走看看