一文理解C# explicit和implicit关键字

一、这两个关键字有什么用?

(1)考虑下面的需求,Person类有个字段age。我想使用Person p = (Person) 18 来创建一个age为18的Person对象,怎么办?

更进一步,我想使用Person p = 18 来创建一个age为18的Person对象,怎么办?

(2)类似,Person类有个字段name。我想使用Person p = (Person) “张三” 来创建一个name为张三的Person对象,怎么办?

更进一步,我想使用Person p = “张三” 来创建一个name为张三的Person对象,怎么办?

总结:这两个关键字帮我们实现 “自定义类型” 之间的显式转换和隐式转换。

二、代码实例解析

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace explicit和implicit关键字
{

//----------------------------------------------------------------------------------------------------------------------------

    class Program
    {
        static void Main(string[] args)
        {
            Animal animal1 = new Animal("猫");     //普通动物”猫“的定义
            Console.WriteLine(animal1.Name);

            Console.WriteLine("===========字符串到动物之间的转换==========");
            Animal animal2 = (Animal)"狗";            //”字符串“到Animal的” 显式转换 “
            Console.WriteLine(animal2.Name);

            Animal animal3 = "狼";                          //”字符串“到Animal的”隐式转换 “
            Console.WriteLine(animal3.Name);
            //------------------------------------------------
            Console.WriteLine("===========运算符重载======================");
            animal1.Weight = 111;
            animal2.Weight = 222;
            Animal animal4 = animal1+animal2;
            Console.WriteLine(animal4.Weight);

            Console.WriteLine("===========动物到人的转换==================");
            Person person1 = (Person)animal1;       //”Animal“到Person的” 显式转换 “
            Console.WriteLine(person1.Name);
        }
    }

扫描二维码关注公众号,回复: 2458992 查看本文章

//----------------------------------------------------------------------------------------------------------------------------
    /// <summary>
    /// 定义动物类,动物有名字,名字是字符串,实现“字符串”到“动物”的显示和隐式转换
    /// </summary>
    class Animal
    {
        private string name;
        public string Name     //属性和字段name
        {
            set { name = value; }
            get { return name; }
        }

        private double weight;
        public double Weight    //属性和字段weight
        {
            set { weight = value; }
            get { return weight; }
        }

        public Animal(string name)    //有参数的公共构造函数
        {
            this.name = name;
        }

        public Animal()
        {

        }
        public static Animal operator +(Animal animal1,Animal animal2)   //这就是实现动物类的  “运算符重载”
        {
            Animal animal3=new Animal();
            animal3.weight = animal1.weight + animal2.weight;
            return animal3;
        }

        //public static explicit operator Animal(string st)    // 这是 “字符串” 到动物类的显式转换,但注意的是A类到B类的”显    
        //{                                                                           //式“和” 隐式“ 转换只能定义一个,不能同时定义两个。
        //    return new Animal(st);
        //    //return new Animal() { name = st };
        //}

        public static implicit operator Animal(string st)    //这是 “字符串” 到动物类的隐式转换
        {
            return new Animal(st);
            //return new Animal() { name = st };   //这两种返回方式均可以,但第二种要求Animal类有无参公共构造函数
        }

    }

//----------------------------------------------------------------------------------------------------------------------------
    /// <summary>
    /// 人也是动物,而且人也有名字,定义“动物”到“人”的转换
    /// </summary>
    class Person  
    {
        private string name;
        public string Name
        {
            set { name = value; }
            get { return name; }
        }
        public Person(string name)
        {
            this.name = name;
        }
        public static explicit operator Person(Animal animal)     //动物类
        {
            return new Person(animal.Name);
        }

    }

}
三、运行结果


===========字符串到动物之间的转换==========


===========运算符重载======================
333
===========动物到人的转换==================

请按任意键继续. . .

四、总结

1、explicit和implicit本质上是“ 运算符 ”,故而与运算符重载有点类似,这里作为对比总结。

2、运算符重载的格式:

       public static 返回类型 operator +(操作对象){        }

如:public static Animal operator +(Animal animal1,Animal animal2)  

3、显示或隐式转换的格式:

       public static 关键字 operator 要转换的目标类型(被转换的类型)    {      }

如:public static explicit operator Person(Animal animal)   

猜你喜欢

转载自blog.csdn.net/qq_27825451/article/details/81272428