zoukankan      html  css  js  c++  java
  • C# 隐式转换 显示转换


    什么是隐式转换:转换的类型内部有对应implicit operator方法的可进行隐式转换


    什么是显示转换:转换的类内部有对应explicit operator或implicit operator方法的可进行显式转换


    隐式的转换由其内部implicit operator方法转换,程序员只需写value1=value2即可。

    显式的转换由其内部explicit operator方法转换,若没有explicit operator,将使用implicit operator方法。程序员需标明转换类型value1=(value1Type)value2。


    隐式转换方法示例:

        public class Type1
        {
            private int value = 0;
            public Type1(int value)
            {
                this.value = value;
            }
            //隐式的将double类型转为Type1类型
             public static implicit operator Type1(double v)
            {
                return new Type1(Convert.ToInt32(v));
            }
             //隐式的将Type1类型转为double类型
            public static implicit operator  double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }
        }

    使用时:

               Type1 tt = new Type1(123);
                double dd = tt;
         
                double d=222;
                Type1 t = d;


    显式转换方法示例:

     public class Type1
        {
            private int value = 0;
            public Type1(int value)
            {
                this.value = value;
            }
            //显示的将double类型转为Type1类型
            public static  explicit operator  Type1(double v)
            {
                return new Type1(Convert.ToInt32(v));
            }
            //显示的将Type1类型转为double类型
            public static explicit operator  double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }
        }

    使用时:

                Type1 tt = new Type1(123);
                double dd =(double) tt;
         
                double d=222;
                Type1 t = (Type1)d;


    注意:

    1.如果上面的Type1只定义了隐式转换方法(implicit operator),当对Type1显式转换时,将调用其隐式转换方法,但相反若只定义了显式转换方法(explicit oprator),直接进行隐式转却无法调用显式转换方法。
    2.在Type1内,相同类型间相同转换方向的显式与隐式转换方法不能同时存在:

    如:不能同时存在

           public static explicit operator double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }

           public static implicit operator double(Type1 v)
            {
                return Convert.ToDouble(v.value);
            }

    但是却可以同时存在:

           public static explicit operator Type1(double v)//将double显式转换为Type1
            {
                return new Type1(Convert.ToInt32(v));
            }
            public static implicit operator double(Type1 v)//将Type1隐式转换为double
            {
                return Convert.ToDouble(v.value);
            }



    PS:基本类型之间的数据转换有下面几个方法:(以double转int为例):

    double d=123;

    int i=0;

    1.i=Convert.ToInt32(d);

    2.i=Int.Parse(d.ToString());

    3.int.Trypase(d.ToString(),out i);

    4.i=(int)d;


    这四者的区别在于:

    第一种转换参数支持最多,可以支持大部分基本类型:double,bool,string,byte.....

    第二种是属于Int类型自己的转换方法,参数只能是string

    第三种与第二种类似,但是返回值是bool表示转换是否成功。他的特点在于如果转换失败不会抛出异常只会返回false,而第二种则会抛出异常。

    第四种只能是数值类型间的强制类型转换。


    作者:Mr.Jimmy
    出处:https://www.cnblogs.com/JHelius
    联系:yanyangzhihuo@foxmail.com
    如有疑问欢迎讨论,转载请注明出处

  • 相关阅读:
    修改git提交的用户名和密码
    并发编程大师系列之:wait/notify/notifyAll/condition
    并发编程大师系列之:Synchronized的类锁和对象锁
    并发编程大师系列之:线程的定义和中断 interrupt
    SpringBoot项目mysql配置文件密码加密(jasypt)
    Linux下安装nginx实现伪分布
    idea远程debug调试阿里云ECS
    使用docker简单启动springboot项目
    用Navicat连接阿里云ECS服务器上的MySQL数据库
    Linux下安装JDK1.8
  • 原文地址:https://www.cnblogs.com/JHelius/p/14318924.html
Copyright © 2011-2022 走看看