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和小乌龟
    idea配置tomcat
    Maven下载及配置
    JDK(1.6,1.7,1.8,10,11)64位解压版配置使用
    SQL中Case When的用法
    mybatis批量新增和修改删除
    org.apache.ibatis.binding.BindingException表示mapper.xml没找到
  • 原文地址:https://www.cnblogs.com/JHelius/p/14318924.html
Copyright © 2011-2022 走看看