• .net 中的一些转换机制


    • 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
  • 相关阅读:
    CMMI全称是Capability Maturity Model Integration,即能力成熟度模型集成
    【beta】Scrum站立会议第5次....11.7
    【beta】Scrum站立会议第3次....11.6
    补交进度条
    【beta】Scrum站立会议第1次....11.3
    【week7】psp
    【week6】psp
    【week6】约跑App视频链接
    【week6】团队贡献分
    【week6】用户数
  • 原文地址:https://www.cnblogs.com/aqgy12138/p/12728014.html
Copyright © 2020-2023  润新知