定义显式(隐式)运算符 总结

   定义显式(隐式)运算符,通常是为了让开发人员进行自定义类型转换,提供开发的方便性和效率性。


   基本格式如下:

            public static implicit operator XXX(参数)--  隐式重载运算符

            public static explicit operator XXX(参数)--  显式重载运算符

   

           显式(隐式)的区别通俗的说就是在进行类型转换的时候,前段是否需要写明:(转换类型)

          隐式可能造成代码不易于初级水平阅读


这个引用微软的经典例子方便理解:

            Digit dig = new Digit(7);
            //This call invokes the implicit "double" operator
            double num = dig;
            //This call invokes the implicit "Digit" operator
            Digit dig2 = 12;
            Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);

  class Digit
    {
        public Digit(double d) { val = d; }
        public double val;
        // ...other members


        // User-defined conversion from Digit to double
        public static implicit operator double(Digit d)
        {
            return d.val;
        }
        //  User-defined conversion from double to Digit
        public static implicit operator Digit(double d)
        {
            return new Digit(d);
        }
    }


注意事项:

       区分(类型) 和as 的使用场合

                as曾经一直认为是来自于vb的历史遗留,不管对错,在如今的C#中依旧有很多的使用。

               1 如果需要转换的两种类型本身无关,在进行自定义类型转换的过程中没有使用object传递参数,或者两者没有父子关系,可以使用(类型),as不正确;

               2 两种转换类型如果通过object传参,则会忽略掉自己写的重载运算符,编译器会自己生成代码来进行检测,这个时候需要使用as才可以编译通过。可以设置断点来判断上述情况是否准确;

               3 两种转换类型如果存在父子关系即基类子类关系,使用as,如果是子类跟子类则使用转换操作符;

               很多资料会把1 3这样写:如果两个类都上溯到了某一个共同的基类,那么根据此基类的转型应该使用as,如果子类跟子类则使用转换操作符,这样说更加方便理解;


 




版权声明:本文为SzzXiaoY原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。