c#之用户定义的数据类型转换介绍

所属分类: 软件编程 / C#教程 阅读数: 101
收藏 0 赞 0 分享

c# 允许用户进行两种定义的数据类型转换,显式和隐式,显式要求在代码中显式的标记转换,其方法是在圆括号中写入目标数据类型。

对于预定义的数据类型,当数据类型转换时可能失败或丢失某些数据,需要显式转换,

1 把int数值转换成short时,因为short可能不够大,不能包含转换的数值。

2 把有符号的数据转换为无符号的数据,如果有符号的变量包含一个负值,会得到不正确的结果。

3 把浮点数转换为整数数据类型时,数字的小数部分会丢失。

此时应在代码中进行显式数据类型,告诉边起义你知道这会有丢失数据的危险,因此编写代码时套把这些可能考虑在内。

c#允许定义自己的数据类型,这意味着需要某些工具支持在自己的数据类型间进行数据转换。方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明是隐式或者显式,以说明怎么使用它。

注意:如果源数据值使数据转换失败,或者可能会抛出异常,就应把数据类型转换定义为显式。

定义数据类型转换的语法类似于运算符重载。

例如  :隐式类型转换:

复制代码 代码如下:

public static implicit operator float(Current current)
{
}

和运算符重载相同,数据类型转换必须声明为public和static。

注意:

当数据类型转换声明为隐式时,编译器可以显式或者隐式的调用数据类型转换。

当数据类型转换声明为显式时,编译器只能显式的调用类型转换。

下面是个小例子:

复制代码 代码如下:

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

namespace 类型转换
{
struct Current
{
public uint Dollars;
public ushort Cents;

public Current(uint dollars, ushort cents)
{
this.Dollars = dollars;
this.Cents = cents;
}

public override string ToString()
{
return string.Format("{0}.{1,-2:00}",Dollars,Cents);
}

public static implicit operator float(Current value)
{
return value.Dollars+(value.Cents/100.0f);
}

public static explicit operator Current(float f)
{
uint dollars = (uint)f;
ushort cents = (ushort)((f - dollars) * 100);
return new Current(dollars,cents);
}

}

class Program
{
static void Main(string[] args)
{
try
{
Current balance = new Current(50, 35);
Console.WriteLine(balance);
Console.WriteLine("balance using tostring(): "+balance.ToString());
float balance2 = balance;
Console.WriteLine("After converting to float,= " + balance2);
balance = (Current)balance2;
Console.WriteLine("After converting to Current,= " + balance);
float t = 45.63f;
Current c = (Current)t;
Console.WriteLine(c.ToString());

checked
{
balance = (Current)(-50.5);
Console.WriteLine("Result is:" + balance.ToString());
}
}
catch (System.Exception ex)
{
Console.WriteLine("Exception occurred:" + ex.Message);
}
Console.ReadKey();
}
}
}


将涉及到两个问题:

1 从float转换为Current得到错误的结果50.34,而不是50.35.----圆整造成的....发生截断问题。

答:如果float值转换为uint值,计算机就会截断多余的数字,而不是去圆整它。计算机中数据是通过二进制存储的,而不是十进制,小数部分0.35不能以二进制形式储存。因为舍弃一部分,故实际转化成的数据要小于0.35,即可以用二进制形式存储的值,然后数字乘以100,得到小于35的数字34.有时候这种阶段是很危险的,避免这种错误的方式时确保在数字转换过程中执行智能圆整操作。

Microsoft编写了一个类System.Covert来完成该任务。System.Covert包含大量的静态方法来执行各种数字转换,我们要使用的是Convert.ToUInt16()。注意,在使用System.Covert方法会产生额外的性能损耗,所以只有在需要的时候才使用。

注意: System.Covert方法还执行他们自己的溢出检查,所以

复制代码 代码如下:

Convert.ToUInt16((f - dollars) * 100);

可以不放在checked里面.

2 在试图转换超出范围的值时,没有发生异常。主要是因为:发生溢出的位置根本就不在Main例程中--这是在转换运算符的代码中发生的,改代码在Main()方法中调用,该方法没有标记为checked。  其解决方法:

复制代码 代码如下:

 public static explicit operator Current(float f)
{
checked
{
uint dollars = (uint)f;
ushort cents = Convert.ToUInt16((f - dollars) * 100);
return new Current(dollars, cents);
}
}<SPAN style="FONT-FAMILY: Arial, Verdana, sans-serif">
</SPAN>

更多精彩内容其他人还在看

c#开发word批量转pdf源码分享

已经安装有Office环境,借助一些简单的代码即可实现批量Word转PDF,看下面的实例源码吧
收藏 0 赞 0 分享

c# xml API操作的小例子

这篇文章主要介绍了c# xml API操作的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

c#唯一值渲染实例代码

这篇文章主要介绍了c#唯一值渲染实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

淘宝IP地址库采集器c#代码

这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C#在后台运行操作(BackgroundWorker用法)示例分享

BackgroundWorker类允许在单独的专用线程上运行操作。如果需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题,下面看示例
收藏 0 赞 0 分享

c#文本加密程序代码示例

这是一个加密软件,但只限于文本加密,加了窗口控件的滑动效果,详细看下面的代码
收藏 0 赞 0 分享

c#生成站点地图(SiteMapPath)文件示例程序

这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
收藏 0 赞 0 分享

C# 键盘Enter键取代Tab键实现代码

这篇文章主要介绍了C# 键盘Enter键取代Tab键实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

C# WinForm导出Excel方法介绍

在.NET应用中,导出Excel是很常见的需求,导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式
收藏 0 赞 0 分享

C#串口通信程序实例详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,创建C#串口通信程序的具体实现是如何的呢?让我们开始吧
收藏 0 赞 0 分享
查看更多