码迷,mamicode.com
首页 > Web开发 > 详细

.net 中的一些转换机制

时间:2020-04-20 22:09:37      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:方法   off   一个   creat   文件的   system   class   tar   ati   

  • Convert类及其功能
  • 采用舍入方式而非截断方式的实数到整数的转换
  • 解析二进制、八进制和十六进制数字
  • 动态转换
  • XmlConvert及其在XML格式化和解析中的作用
  • 类型转换器及其在设计器和XAML格式化和解析中的作用
  • 支持二进制转换的BitConverter

一.Convert

.Net Framework将以下类型成为基本类型:

bool、char、string、System.DateTime、System.DateTimeoffset和所有C#数字类型。

静态类Convert定义将每一个基本类型转换为其它基本类型的方法。可是这些方法大部分没有什么实际用处;要么抛出异常,要么是隐式转换的冗余方法。

ps:所有的基本类型都(显示)实现IConvertible,它定义了转换到其他基本类型的方法。在大多数情况下都直接调用Convert类的方法。编写一个接受IConvertible类型的参数的方法在特定的情况用处是很大的。

1.实数到实数的舍入转换

数字类型的显示和隐式转换概括为。

  • 隐式转化只支持无损转化(例如int到double的转换)
  • 有损转化则需要使用显示转换(了如double到int的转换)

转换操作是进行了效率优化的,因此它将截断不符合要求的数据。这可能导致从一个实数转换为一个整数的操作出现问题。因为在这种情况下通常希望将结果进行舍入而非截断。

double d=3.9;int i=Convert.ToInt32(d);//i==4

Convert采用银行舍入的方式,将中间值转换为偶整数(这样可以避免正负差)。如果舍入方式不适用,那么可以对实数调用Math.Round方法,该方法使用额外的参数控制中间的舍入方式。

2.解析二、八、十六进制数字

To(整数类型)的方法包括一些重要的重载方法,它们可以将字符串转换为其他进制:

 int thirty = Convert.ToInt32("1E", 16);//30 Parse in hexadecimal
 uint five = Convert.ToUInt32("101", 2);//5 Parse in binary

第二参数指定了进制数,它可以是任何一种进制,但必须是三种中的一个。

3.动态转换

Convert提供了ChargeType方法。

Type targetType = typeof(int);
object source = "42";
object result = Convert.ChangeType(source, targetType);
Convert.ChangeType(source, targetType);
Console.WriteLine(result);//42
Console.WriteLine(result.GetType());//System.Int32

ChargeType还能接受IFormatProvider(格式提供器)

CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
Type targetType = typeof(double);
string source = "1,034,562.91";
var result = Convert.ChangeType(source, targetType,culture);
Console.WriteLine(result);//1034562.91
Console.WriteLine(result.GetType());//System.Double

ps:ChargeType无法指定格式化字符串,也无法指定解析标记。

4.Base64转换

Base 64使用ASCII字符集中的64个字符将二进制数据编码为可读的字符串。

Convert类的ToBase64String方法将一个字节数组转化为Base 64格式,而FromBase64String方法则与之相反。

二.XmlConvert

在处理XML文件的数据读写,System.Xml命名空间下的XmlConvert类型提供了格式化和解析的最佳方法。XmlConvert的方法不需要提供特殊的格式字符串就能够给处理xml格式的细微差别。例如:XML中的true是“true”而不是“True”。

三.类型转换器

类型转换器在设计时环境中执行格式化和解析操作。它们也能够解析XAML(可扩展应用程序标记语言,Extensible Application Markup Language)文档中的值。XAML主要用于Windows Pesentaion Foundation和Workflow Foundation。

在.Net Framework中有超过100中类型转换器,用于颜色、图像和url等数据。相反格式提供器则为一些简单 的值类型提供了实现。

类型转换器通常会采用多种方式解析字符串,而这个过程并不需要提示。例如:在vs的ASP.NET应用程序中,如果我i们在属性窗口中将控件的BackColor属性赋值为Begie,则Color类型转换器就会判断引用的是一个颜色名称而非RGB字符或系统颜色值。类型转换器的灵活性使它在设计器和XAML文档之外的环境中爷很有用。

所有的类型转换器都是System.ComponentModel命名空间中的TypeConverter类型的子类。如果要获得一个TypeConverter,则需要调用TypeDescriptor.GetConverter方法。

TypeConverter converter = TypeDescriptor.GetConverter(typeof(Color));
Color beige = (Color)converter.ConvertFromString("Beige");//Color[Beige]
Color purple = (Color)converter.ConvertFromString("#800080");//Color[Purple]
Color window = (Color)converter.ConvertFromString("Window");//Color[Window]

通常来说,类型转换器的名称应以Converter结尾,并且通常与它们转换的类型位于同一命名空间中。类型通过TypeConverterAttribute与转换器联系在一起的。这样设计器就能自动获取到对应的转换器了。

类型转换器还可以提供一些设计时的服务,例如为设计器生成标准的下拉列表项,或者辅助代码序列器。

四.BitConverter

大多数基本类型都能通过BitConverter.GetBytes方法转换为字节数组。

当然BitConverter也提供字节数组转换为其他类型的方法。

BitConverter不支持decimal类型和Datime(Offset)类型,但可以通过decimal.GetBits将一个decimal类型转化为一个int数组。另外,decimal也提供了一个接受int数字的构造器。

而对于Dateime,则可以调用一个实例的ToBinary方法,它会返回一个long,然后可以通过BitConverter进行转换了。静态的DateTime.FromBitnary方法则可以执行相反的操作。

 decimal a = 10;
 var b = decimal.GetBits(a);
 decimal c = new Decimal(b);
 Console.WriteLine(a == c);//true

 

.net 中的一些转换机制

标签:方法   off   一个   creat   文件的   system   class   tar   ati   

原文地址:https://www.cnblogs.com/aqgy12138/p/12728014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!