代码改变世界

C#中的不同类型之间的显式与隐式转换实现

2012-05-30 16:02  Andrew.Wangxu  阅读(595)  评论(3编辑  收藏  举报

在项目中可能经常遇到不同类型之间的转换, 如 int转换为byte   double转换为int。

那么这些显式或隐式转换是如何实现的呢,下面也是以User对象举例。

首先贴上来User.cs的所有属性

        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 持有金额
        /// </summary>
        public int Money { get; set; }

 

需求实现如下代码的可用性:

            User u1 = 5;                    //int隐式转换为User
            User u2 = "王旭";               //string隐式转换为User

            int money = (int)user;          //User显式转换为int
            string name = (string)user;     //User显式转换为string

 

--------------------------------------------

解释完需求后,下面是咱们的实现代码了:

在User.cs中:

        #region 类型转换构造函数

        //构造一个由int类型隐式构造并返回一个User
        public static implicit operator User(int money)
        {
            return new User() { Money = money };
        }

        //构造一个由string类型隐式构造并返回一个User
        public static implicit operator User(string userName)
        {
            return new User() { Name = userName };
        }

        //由一个User对象显式返回一个int
        public static explicit operator int(User user)
        {
            return user.Money;
        }

        //由一个User对象显式返回一个string
        public static explicit operator string(User user)
        {
            return user.Name;
        }

        #endregion

 

关于以上代码的说明:

     对于转换操作符方法,编译器即可生成代码来隐式调用一个转换操作符方法,也可只有在源代码进行了显式转型时,才生成代码来调用一个转换操作符方法。在C#中,implicit 关键字告诉编译器为了生成代码来调用方法,不需要在源代码中进行显式转型。相反,explicit 关键字告诉编译器只有在发现了显式转型时,才调用方法。

 

在implicit 或 explicit 关键字之后,要指定 operator 关键字告诉编译器该方法是一个转换操作符。在 operator 之后,指定对象要转换成什么类型。在圆括号内,则指定要从什么类型转换。

 

以上实现了我们的需求了,下面贴下Main方法,以及Demo的完整例子项目下载:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConvertDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //构造一个User对象
            User user = new User();
            user.Name = "Andrew";
            user.Money = 100;

            //依次测试咱们写的隐式、显式转换吧
            User u1 = 5;                    //int隐式转换为User
            User u2 = "王旭";               //string隐式转换为User

            int money = (int)user;          //User显式转换为int
            string name = (string)user;     //User显式转换为string

            //以上代码测试了咱们写的4个转换方法,下面打印出来看看吧。~
            Console.WriteLine("u1:" + u1.Name + "," + u1.Money);
            Console.WriteLine("u2:" + u2.Name + "," + u2.Money);
            Console.WriteLine("money:" + money);
            Console.WriteLine("name:" + name);

            Console.ReadLine();
        }
    }
}

 

完整Demo项目下载:https://files.cnblogs.com/andrew-blog/ConvertDemo.rar

参考:http://www.wxzzz.com/?id=98