C#学习笔记之用户定义类(或结构)的类型转换

发布时间:2019-07-24编辑:脚本学堂
本文介绍下,有关C#的用户定义类,或用户定义结构进行类型转换的相关知识,有需要的朋友,参考下吧。

1,自己定义的数据类型,需要做某些工作才能支持在自己的数据类型之间进行类型转换,有些像运算符的重载。即用户定义的数据类型的转换。

2,两个原则
①,如果某个类直接或间接继承了另一个类,就不能定义这两个类之间的数据类型转换
②,数据类型转换必须在源或目标数据类型的内部定义

3,如果数据类型转换声明为隐式的,编译器就可以隐式或显式地使用这个转换,如果声明为显式,就只能显式的使用它。
例子,
 

复制代码 代码示例:
    //员工薪金类,计算记录薪金的整数部分和小数部分 
    struct Currency 
    { 
        public uint Dollars; 
        public ushort Cents; 
        public Currency(uint dollars, ushort cents) 
        { 
            this.Dollars = dollars; 
            this.Cents = cents; 
        } 
     
        public override string ToString() 
        { 
            return string.Format("${0}.{1,-2:00}", Dollars, Cents); 
        } 
     
        //定义隐式的类型转换 Currency -> float 
        public static implicit operator float(Currency value) 
        { 
            return value.Dollars + (value.Cents / 100.0f); 
        } 
     
        //定义显示的类型转换 float -> Currency 
        public static explicit operator Currency(float value) 
        { 
            uint dollars = (uint)value; 
            /*
             * Convert方式虽然能保证转化为ushort的过程中没有位数损失,但是性能会有损失
             * 关于float->ushort的转化,假设0.35这样一个小数, 
             * 作为二进制只能存储为一个略小于0.35的值,
             * 所以再乘以100并转换为ushort的时候会得到一个比35小的数34,
             * 但并不是所有float型小数都是这样的,
             * Console.WriteLine((ushort)(0.35f * 100));
             * 这里为了防止这一问题使用Convert提供的数字转换方法
             */ 
            ushort cents = Convert.ToUInt16((value - dollars) * 100); 
            return new Currency(dollars, cents); 
        } 
     
    } 
     
    class Program 
    { 
        static void Main(string[] args) 
        { 
            //因为定义了Currency -> float的隐士类型转化,所以可以编译通过 
            Currency balance = new Currency(100, 50); 
           float f = balance; 
     
            //定义了 float -> Currency的显示类型转化,所以也没有问题 
            float alinuxjishu/9952.html target=_blank class=infotextkey>mount1 = 100.50f; 
           Currency c1 = (Currency)amount1; 
     
            //没有定义 float -> Currency的隐式类型转化,所以编译问题 
            float amount2 = 100.50f; 
           Currency c2 = amount2;             
     
            Console.Read(); 
        } 
    }

  希望以上有关c#用户定义类(或结构)的类型转换的介绍,对大家有所帮助,祝大家学习进步。