一、这两个关键字有什么用?
(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);
}
}
//----------------------------------------------------------------------------------------------------------------------------
/// <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)