C#==>用户定义类(或结构)的类型转换
2009-12-26 22:04
330 查看
1,对于我们自己定义的数据类型,我们需要做某些工作才能支持在自己的数据类型之间进行类型转换,
有些像运算符的重载。这就是用户定义的数据类型的转换
2,有两个原则
①,如果某个类直接或间接继承了另一个类,就不能定义这两个类之间的数据类型转换
②,数据类型转换必须在源或目标数据类型的内部定义
3,如果数据类型转换声明为隐式的,编译器就可以隐式或显式地使用这个转换,如果声明为显式,就只能显式的使用它。
实例如下
有些像运算符的重载。这就是用户定义的数据类型的转换
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#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
- C#==>类型转换 与 装箱拆箱
- 【C#】List<T>类型强制转换
- 【第二篇日记】C# 的转义字符,结构定义、字符转换、类型检查、运算符以及正则表达式
- C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
- c#之用户定义的数据类型转换介绍
- C#编程(四十一)----------用户定义的数据类型转换
- c#之用户定义的数据类型转换
- C#(文字类型转换)【下拉菜单->C#字体CodeBehind】附:【用C#实现生成PDF文档】
- List<?>不能直接被类型转换
- List<T>泛型集合 类型整体快速转换
- 解决GridView绑定时无法将类型为 <>f__AnonymousType0`2[xx] 的对象强制转换为类型“xxx”的方法
- C++类型转换关键字 *_cast<type> (expression)
- C++ 类型转换 atoi atol atof itoa ftoa <stdlib.h>
- C++类型转换运算符之const_cast<newtype>(expression)
- C#中string[]数组和list<string>泛型的相互转换
- libpcap中<pcap.h>定义的结构
- Java 数据类型转换,String->float,float->int ,String<->int (2013-07-24 14:01:57)
- 【基础语言学习】C#中的可空类型运算(Nullable<T>)------T?