zoukankan      html  css  js  c++  java
  • operator、explicit与implicit

    说这个之前先说下什么叫隐式转换显示转换

    1、所谓隐式转换,就是系统默认的转换,其本质是小存储容量数据类型自动转换为大存储容量数据类型。

    例如:float f = 1.0; double d=f;这样就是把float类型的f隐式转换成double类型了!但其实系统帮我们做了类似如下的工作:

    float f = 1.0; double d=(double)f;

    对于表示数值的基本数据类型来说,数值范围小的数据类型转换成数值范围大的数据类型可以进行隐式转换,而反过来则必须进行显示转换

    2、显式类型转换,即强制类型转换。与隐式转换相反,而且强制转换会造成数据丢失。

    例如:double d = 1.456; float f=(float)d;

    只要强制指出转换成什么类型,就表示是显示转换

    class Person:Animal{}

    Person p=(Person)Animal; //显示转换

    Animal a=p; //隐式转换

    对于类类型来说,子类转换成父类可以进行隐式转换,而反过来则必须进行显式转换,如果两个类之间没有继承关系,则不能进行隐式转换或显式转换,此时必须在被转换的类中定义一个隐式转换(implicit)方法或显式转换(explicit)方法。

    基本上是没有转换表达式的转换都是隐式转换,比如double a = 1 ;

    而int类型显示转换成double显示转换就带有显示的(double)转换类型doubl a=(double)1;

    隐式转换、显式转换是由对象兼容性而来的。兼容性包含两个方面,一个是它们之间具有继承或实现接口的关系。比如A继承自B,那么B有的东西A肯定有;A实现了B接口,那B规定的东西A肯定都有。这时候,A都可以隐式转换为B,因为B有的A肯定都有,这是必然的。如果一个对象类型为B,那么则不可以隐式转换为A,因为A有的东西B不一定有;但如果你知道这个类型为B的东西一定是A,那么就可以用显式转来来转换对象类型。另一种转换则是由对象规定的运算符,对象可以规定自己的显式或隐式运算符,将自己同另外一种对象间相互转换,这是通过运算符重载实现的(也就是接下来要讲的explicit(显示转换)implicit(隐式转换),不怎么常用)。而Parse方法则是对象自带的方法,你可以看作是和上面的运算符显式转换相同作用的,不过它是通过定义一个静态方法来实现转换。Convert也是这个用处,但是它做的工作比Parse方法一般要多,因此兼容性更好,但是速度也就会稍慢一些。

    operator、explicit与implicit

    operator 关键字用来重载内置运算符

        class Program
        {
            static void Main(string[] args)
            {
                Person p1 = new Person() { Age = 3 };
                Person p2 = new Person() { Age = 3 };
                Console.WriteLine(p1 == p2); //输出True
    
                int i = p1;
                Console.WriteLine(i);  //输出3
    
                Person p3 = (Person)4;
                Console.WriteLine(p3.Age); //输出4
    
                Person p4 = p1 + p2;
                Console.WriteLine(p4.Age);//输出6
    
                Console.ReadKey();
            }
        }
    
        public class Person
        {
            public int Age { get; set; }
    
            public static bool operator ==(Person p1, Person p2)
            {
                return p1.Age == p2.Age;
            }
    
            public static bool operator !=(Person p1, Person p2)
            {
                return p1.Age != p2.Age;
            }
    
            public static Person operator +(Person p1, Person p2)
            {
                return new Person() { Age = p1.Age + p2.Age };
            }
    
            /*
             * 作用:是把Person类型隐式转换成int类型
             * 使用显示转换也是可以的 
            */
            public static implicit operator int(Person p)
            {
                return p.Age;
            }
    
            /*
             * 作用:是把int类型显式转换成Person类型
             * 使用隐示转换则会报错,指定显示转换则必须用显示转换,不可以用隐式转换
            */
            public static explicit operator Person(int i)
            {
                return new Person() { Age = i };
            }
        }
  • 相关阅读:
    源码篇——安卓启动流程
    Android源代码结构分析
    使用Contacts Contract Content Provider操作通讯录最佳实践
    Linux输入子系统 : 按键驱动
    运算类实现 及 GNU Makefile基本结构
    输入系统:epoll & inotify
    FFmpeg:初步编译使用[Android]
    Linux学习 :SPI通讯协议
    Linux学习 : 自己写bootloader
    Linux学习 :移植U-boot_2012.04.01到JZ2440开发板
  • 原文地址:https://www.cnblogs.com/MrZivChu/p/operator.html
Copyright © 2011-2022 走看看