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 amount1 = 100.50f;
Currency c1 = (Currency)amount1;
//没有定义 float -> Currency的隐式类型转化,所以编译问题
float amount2 = 100.50f;
Currency c2 = amount2;
Console.Read();
}
}
希望以上有关c#用户定义类(或结构)的类型转换的介绍,对大家有所帮助,祝大家学习进步。
您可能感兴趣的文章:
C#学习笔记之用户定义类(或结构)的类型转换
C语言复习笔记之数据结构详解
c语言学习的简要笔记
C#学习笔记之C#中的类
C#泛型:泛型特点、泛型继承、泛型接口、泛型委托学习笔记
go struct 成员变量后面再加个字符串是什么意思?_Go语言的学习笔记(第十章) 接口...
C#学习笔记之C#结构
Python是一门怎样的编程语言
go语言学习笔记(十三)——接口类型
c# 类与成员的修饰详解