当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-27

    本文导语:  c# 允许用户进行两种定义的数据类型转换,显式和隐式,显式要求在代码中显式的标记转换,其方法是在圆括号中写入目标数据类型。 对于预定义的数据类型,当数据类型转换时可能失败或丢失某些数据,需要显式转换, 1 把...

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);
}
}


    
 
 

您可能感兴趣的文章:

  • 用c#获得当前用户的Application Data文件夹位置
  • C# Winform 禁止用户调整ListView的列宽
  • 系统进程用户名的获取方法(c#代码)
  • C# 获取系统进程的用户名
  • c#通过进程调用cmd判断登录用户权限代码分享
  • c#获取用户控件中控件的ID的代码
  • c# 对windows用户和组操作实例
  • C#使用伪随机数实现加密用户密码的方法
  • C#学习笔记之用户定义类(或结构)的类型转换
  • 使用C#获取远程图片 Form用户名与密码Authorization认证的实现
  • C#用户定义类型转换详解
  • 用户自定义的信号是不是只有SIGUSR1,SIGUSR2
  • 请问linux进程的实际ID,有效ID,设置用户ID三者的定义和主要区别?
  • Linux上无法使用root、mysql等系统预定义的用户以ftp连结
  • 用户定义类引用??
  • 如何知道用户自定义的纸张的长宽(厘米为单位),请举例说明
  • 这个用户自定义包程序那里有错
  • 在sql Server自定义一个用户定义星期函数
  • please help me ?如何像用户程序一样用man命令察看内核定义函数,如printk,kmalloc等?
  • 在CMP的实体BEAN中怎么添加用户自定义的查找方法
  • 用Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");的情况下,可不可以用dbo的用户名和密码来操作自定义的数据库,要怎
  • 用XML定义用户界面 GTKML
  • asp.net 自定义用户控件数据读取及赋值实例
  • JSP自定义标签获取用户IP地址的方法
  • 用户自定义的信号是不是只有SIGUSR1,SIGUSR2 iis7站长之家
  • 我在一个字符设备写了一些方法,read,write等,我在用户层使用这些系统调用的时候怎么用到我这个字符设备驱动所定义的??
  • CREATE FUNCTION sqlserver用户定义函数
  • java实现日历(某年的日历,某月的日历)用户完全自定义
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教怎么在程序中转换用户?
  • Shell文件中如何转换用户
  • 下班前结帖,请教:如何建立一个几乎具有所有root权限的新用户.使其可以不用su转换来安装软件和删改访问bin,boot等目录。
  • Linux系统进程的几个用户ID及其转换方法--大家讨论一下吧--在实际应用中的用途
  • 我要把在applet里用swing的jtable展现的数据表格,实现打印的功能且可由用户选择需打印的列,该怎么办?不知这种表格能否也象jsp或javascript那样转换成excel呢?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 概念混乱,请专人解释:实际用户ID,有效用户ID,设置用户ID
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • proftp中,如何让FTP的用户是非Linux用户,只是FTP用户?
  • UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍
  • windows 系统是否是多用户操作系统,如何理解“多用户操作系统”的“多用户”?
  • CentOS安装Telnet,以root用户登陆Telnet以及CentOS的各种终端解释
  • 我装的是RED HAT LINUX 8.0,我在root用户中把root用户删除了,怎办也进不了root用户
  • 怎样让普通用户拥有超级用户的权限,是把普通用户的组设为root组吗?具体怎么做,急死了
  • 我一个服务器同时接受到很多个用户的认证请求(得到用户名和密码),然后把用户名密码发给认证服务器。因为是远程认证,所
  • 我装了中软Linux3.1,启动时要求输入用户名和口令,但安装时并没有提示指定用户名,所以现在输入用户名老是错误,不能进入系统,请问该怎
  • root用户附权限给其他用户问题
  • 如何添加一个用户,让这个用户只能访问某个特定的目录,
  • 如何过滤系统用户只显示创建的用户?
  • 匿名用户登录nobody用户的作用
  • 怎样在程序中将普通用户切换成root用户
  • 创建用户组创建用户出错
  • 求助:忘记了root用户的密码,如何给普通用户赋root权限
  • 请教用户组和用户的问题
  • Public key用户 创建的用户不能登录
  • 利用root用户修改一般用户密码的批处理文件怎么写呢?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3