.NET Framework - 数据类型 & 类型转换

创建时间:
2015-01-04 22:42
最近更新:
2018-07-19 16:01

类型转换 方案

  • ToString()
  • 扩大转换 - 隐式转换。扩大转换不会导致数据丢失,但可能导致精度损失。
  • 收缩转换 - 显式转换。收缩转换可能导致数据丢失。
  • 隐式转换 - 使用隐式运算符
  • 显式转换 - 使用显式运算符
  • 强制转换 (Type)(Expressions)
  • 将 checked 关键字与强制转换运算符一起使用来执行 有 检查转换。
  • 将 unchecked 关键字与强制转换运算符一起使用来执行 无 检查转换。默认情况下,显式转换将为无检查转换。
  • 用户定义的转换。可以定义一些特殊的方法来执行用户定义的转换,从而使不具有基类–派生类关系的自定义类型之间可以显式和隐式转换。参见 转换运算符。
  • System.Convert 类 - 详见本站专文
  • 使用帮助程序类的转换。若要在不兼容的类型之间进行转换,例如在整数与 System.DateTime 对象之间转换,或者在十六进制字符串与字节数组之间转换,则可以使用 System.BitConverter 类、System.Convert 类和内置数值类型的 Parse 方法。
  • .NET Framework 提供以下两种机制来将用户定义数据类型 (自定义类型) 转换为其他数据类型: 1. 通过扩展 TypeConverter 类为自定义类型定义类型转换器,并通过 TypeConverterAttribute 特性使类型转换器与类型关联。2. 对自定义类型实现 IConvertible 接口。
  • as 将对象转换为可兼容类型。as 运算符用于在兼容的引用类型之间执行某些类型的转换。as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而非引发异常。它等效于 expression is type ? (type)expression : (type)null,但只计算一次 expression。注意,as 运算符只执行引用转换和装箱转换。as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用强制转换表达式来执行。
  • is 检查对象是否与给定类型兼容。如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则 is 表达式的计算结果将是 true。如果已知表达式将始终是 true 或始终是 false,则 is 关键字将导致编译时警告,但是,通常在运行时才计算类型兼容性。请注意,is 运算符只考虑引用转换、装箱转换和取消装箱转换。不考虑其他转换,如用户定义的转换。在 is 运算符的左侧不允许使用匿名方法。lambda 表达式属于例外。

Resource - MSDN - 数据类型

  1. 类型 (C# 参考)
  2. 类型 (C# 编程指南)
  3. 常规类型系统 - 综述
  4. 指针类型 (C# 编程指南) - 在不安全的上下文中,类型可以是指针类型、值类型或引用类型。
  5. 在 .NET Framework 中使用基类型
  6. 值类型表 (C# 参考)
  7. System.ValueType 类 - 为值类型提供基类。
  8. 默认值表 (C# 参考)
  9. 整型表 (C# 参考)
  10. 浮点型表 (C# 参考)
  11. 匿名类型 (C# 编程指南)
  12. 装箱和取消装箱 (C# 编程指南)

类型参考表 (C# 参考)

  1. 内置类型表 (C# 参考)
  2. 整型表 (C# 参考)
  3. 浮点型表 (C# 参考)
  4. 默认值表 (C# 参考)
  5. 值类型表 (C# 参考)
  6. 隐式数值转换表 (C# 参考)
  7. 显式数值转换表 (C# 参考)
  8. 设置数值结果表的格式 (C# 参考)
  1. 内置类型表 (C# 参考)
  2. 整型表 (C# 参考)
  3. 浮点型表 (C# 参考)
  4. 默认值表 (C# 参考)
  5. 值类型表 (C# 参考)
  6. 隐式数值转换表 (C# 参考)
  7. 显式数值转换表 (C# 参考)
  8. 设置数值结果表的格式 (C# 参考)

值类型 (C# 参考)

  1. ulong (C# 参考)
  2. long (C# 参考)
  3. uint (C# 参考)
  4. int (C# 参考)
  5. ushort (C# 参考)
  6. short (C# 参考)
  7. byte (C# 参考)
  8. sbyte (C# 参考)
  9. char (C# 参考)
  10. bool (C# 参考)
  11. decimal (C# 参考)
  12. double (C# 参考)
  13. float (C# 参考)
  14. struct (C# 参考)
  15. enum (C# 参考)

引用类型 (C# 参考)

  1. class
  2. interface
  3. delegate
  4. dynamic
  5. Object
  6. string

Resource - MSDN - 类型转换

  1. .NET Framework 中的类型转换
  2. .NET Framework 中的类型转换表
  3. 隐式数值转换表 (C# 参考)
  4. 显式数值转换表 (C# 参考)
  5. 通用类型转换
  6. 强制转换和类型转换 (C# 编程指南)
  7. 如何: 将字节数组转换为 int (C# 编程指南)
  8. 如何: 将字符串转换为数字 (C# 编程指南) - 可以使用 Convert 类中的方法或使用各种数值类型 (int、long、float 等) 中的 TryParse 方法将字符串转换为数字。
  9. 如何: 在十六进制字符串与数值类型之间转换 (C# 编程指南)
  10. 如何: 在结构间实现用户定义的转换 (C# 编程指南)

Resource - 类型转换

  1. C# 中 as 和强制转换的总结
  2. C# 判断类型间能否隐式或强制类型转换,以及开放泛型类型转换

Resource - MSDN - 类型转换 - 运算符 & 关键字

  1. 转换运算符 (C# 编程指南)
  2. 使用转换运算符 (C# 编程指南)
  3. () 运算符 (C# 参考) - 除了用于指定表达式中运算符的顺序外,圆括号还用于执行以下任务: 1. 指定强制转换或类型转换。2. 调用方法或委托。强制转换显式调用从一种类型到另一种类型的转换运算符;如果未定义这样的转换运算符,则强制转换将失败。若要定义转换运算符,请参见 explicit 和 implicit。
  4. 运算符关键字 (C# 参考)
  5. explicit (C# 参考)
  6. implicit (C# 参考)
  7. typeof (C# 参考)
  8. is (C# 参考) - 检查对象是否与给定类型兼容。
  9. as (C# 参考) - as 运算符类似于强制转换操作。但是,如果转换是不可能的,as 返回 null 而不引发异常。
  10. 如何: 使用 as 和 is 运算符安全地进行强制转换 (C# 编程指南)

运算符列表

Resource - MSDN - 类型转换 - parse (分析)

  1. 在 .NET Framework 中分析字符串 - A parsing operation converts a string that represents a .NET Framework base type into that base type. 执行分析操作的最常用方法是 Parse 方法。由于分析是格式设置的反向操作 (涉及将基类型转换为字符串表示形式),因此许多相同的规则和约定都适用。
  2. 在 .NET Framework 中分析数值字符串
  3. 在 .NET Framework 中分析日期和时间字符串
  4. 在 .NET Framework 中分析其他字符串 - 除了数值字符串和 DateTime 字符串外,还可以分析将 Char、Boolean 和 Enum 类型表示为数据类型的字符串。
  5. System.Int32.Parse 方法 - 将数字的字符串表示形式转换为它的等效 32 位有符号整数。
  6. System.Int32.TryParse 方法 - 将数字的字符串表示形式转换为它的等效 32 位有符号整数。一个指示操作是否成功的返回值。
  7. 如何: 确定字符串是否表示数值 (C# 编程指南)
  8. System.Globalization.NumberStyles 枚举 - 确定允许传递给数值字符串参数中的样式 Parse 和 TryParse 整型和浮点型数值类型的方法。

Resource - MSDN - 类型转换 - 字符编码

  1. System.Char.ConvertFromUtf32 方法 - 将指定的 Unicode 码位转换为 UTF-16 编码字符串。
  2. System.Char.ConvertToUtf32 方法 - 将 UTF-16 编码的代理项对的值转换为 Unicode 码位。

Resource - MSDN - 类型转换 类库

  1. System.InvalidCastException 类 - 当执行了无效的强制转换或显式转换时引发的异常。
  2. System.BitConverter 类 - 将基数据类型转换为一个字节数组以及将一个字节数组转换为基数据类型。
  1. System.IFormattable 接口 - 提供一种功能,用以将对象的值格式化为字符串表示形式。
  2. System.IFormatProvider 接口 - 提供格式设置和分析操作中使用的提供格式设置信息的对象。格式设置操作将一种类型的值转换为该值的字符串表示形式。典型的格式设置方法包括 ToString 类型的方法,以及 Format。分析操作将字符串值的表示形式转换为具有该值的类型。典型的分析方法包括 Parse 和 TryParse。
  3. System.IConvertible 接口 - 此接口提供方法将实现类型实例的值转换为公共语言运行时类型具有等效值。为了支持任意类型到公共语言运行时基类型的转换,.NET Framework 提供了 IConvertible 接口。需要使用实现类型以提供以下方法: 1. 一个返回实现类型的 TypeCode 的方法。2. 用于将实现类型转换为公共语言运行时的每一种基类型 (即 Boolean、Byte、Char、DateTime、Decimal、Double、Int16、Int32、Int64、SByte、Single、String、UInt16、UInt32 和 UInt64) 的各种方法。3. 一个用于将实现类型的实例转换为另一个指定类型的通用转换方法。不支持的转换应引发 InvalidCastException。
  4. System.Convert 类 - 将一个基本数据类型转换为另一个基本数据类型。该类为 static 类,该类的全部成员均为 public static。该类的成员除了 public static readonly object DBNull 字段,其它全部是方法。该类源码详见本站专文。虽然可以调用每个基类型的 IConvertible 接口实现来执行类型转换,但从一种基类型转换为另一种基类型时,建议您调用 System.Convert 类的方法,这种方式与语言无关。

整型

本节内容复制自《C# 语言规范 版本 5.0 - 4.1.5 整型》C:\Program Files\VisualStudioUltimate2013\VC#\Specifications\2052\CSharp Language Specification.docx

C# 支持 9 种整型:sbyte、byte、short、ushort、int、uint、long、ulong 和 char。整型具有以下所列的大小和取值范围:

  1. sbyte 类型表示有符号 8 位整数,其值介于 –128 和 127 之间。
  2. byte 类型表示无符号 8 位整数,其值介于 0 和 255 之间。
  3. short 类型表示有符号 16 位整数,其值介于 –32768 和 32767 之间。
  4. ushort 类型表示无符号 16 位整数,其值介于 0 和 65535 之间。
  5. int 类型表示有符号 32 位整数,其值介于 –2147483648 和 2147483647 之间。
  6. uint 类型表示无符号 32 位整数,其值介于 0 和 4294967295 之间。
  7. long 类型表示有符号 64 位整数,其值介于 –9223372036854775808 和 9223372036854775807 之间。
  8. ulong 类型表示无符号 64 位整数,其值介于 0 和 18446744073709551615 之间。
  9. char 类型表示无符号 16 位整数,其值介于 0 和 65535 之间。char 类型的可能值集与 Unicode 字符集相对应。虽然 char 的表示形式与 ushort 相同,但是可以对一种类型进行的所有计算并非都可以对另一种类型执行。

整型一元运算符和二元运算符总是对有符号 32 位精度、无符号的 32 位精度、有符号 64 位精度或无符号 64 位精度进行计算:

  • 对于一元运算符 +,操作数转换为类型 T,其中 T 是 int、uint、long 和 ulong 中第一个可以完全表示操作数的所有可能值的类型。然后用 T 类型的精度执行运算,结果的类型是 T 类型。
  • 对于一元运算符 –,操作数转换为类型 T,其中 T 是 int 和 long 中第一个可以完全表示操作数的所有可能值的类型。然后用 T 类型的精度执行运算,结果的类型是 T 类型。一元运算符 – 不能应用于类型 ulong 的操作数。
  • 对于 +、–、*、/、%、&、^、|、==、!=、>、<、>= 和 <= 二元运算符,操作数转换为类型 T,其中 T 是 int、uint、long 和 ulong 中第一个可以完全表示两个操作数的所有可能值的类型。然后用 T 类型的精度执行运算,运算的结果的类型也属于 T(对于关系运算符为 bool)。对于二元运算符,不允许一个操作数为 long 类型而另一个操作数为 ulong 类型。
  • 对于二元运算符 << 和 >>,左操作数转换为类型 T,其中 T 是 int、uint、long 和 ulong 中第一个可以完全表示操作数的所有可能值的类型。然后用 T 类型的精度执行运算,结果的类型是 T 类型。

char 类型归类为整型类型,但它在以下两个方面不同于其他整型:

  • 不存在从其他类型到 char 类型的隐式转换。具体而言,即使 sbyte、byte 和 ushort 类型具有完全可以用 char 类型来表示的值范围,也不存在从 sbyte、byte 或 ushort 到 char 的隐式转换。
  • char 类型的常量必须写成 character-literall 或带有强制转换为类型 char 的 integer-literal。例如,(char)10 与 '\x000A' 相同。

checked 和 unchecked 运算符和语句用于控制整型算术运算和转换(第 7.6.12 节)的溢出检查。在 checked 上下文中,溢出产生编译时错误或导致引发 System.OverflowException。在 unchecked 上下文中将忽略溢出,任何与目标类型不匹配的高序位都被放弃。

测试 - object / ValueType 转换为整型

using System;

namespace ConsoleNet451
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 123;
            long l;
            ulong u;

            #region object:

            object o = i;

            i = (int)o; //转换成功。

            try {
                l = (long)o;
            }
            catch(System.InvalidCastException ex) {
                string m = ex.Message; //指定的转换无效。
            }

            try {
                u = (ulong)o;
            }
            catch(System.InvalidCastException ex) {
                string m = ex.Message; //指定的转换无效。
            }

            u = Convert.ToUInt64(o);

            #endregion object.
            #region ValueType:

            ValueType v = i;

            i = (int)v; //转换成功。

            try {
                l = (long)v;
            }
            catch(System.InvalidCastException ex) {
                string m = ex.Message; //指定的转换无效。
            }

            try {
                u = (ulong)v;
            }
            catch(System.InvalidCastException ex) {
                string m = ex.Message; //指定的转换无效。
            }

            u = Convert.ToUInt64(v);

            #endregion ValueType.
        }
    }
}

测试 - null & DBNull 转换为字符串

using System;
namespace Net451Console
{
    class Program
    {
        static void Main(string[] args)
        {
            object oNull = null;
            bool[] result = {
                Convert.ToString(oNull) == string.Empty,
                Convert.ToString(DBNull.Value) == string.Empty,
                DBNull.Value.ToString() == string.Empty
            };
            //执行至此 result 中全部元素均为 true。
        }
    }
}

以下为 Convert.ToString() 的签名:

// 将指定对象的值转换为其等效的字符串表示形式。如果 value 为 null,则为 System.String.Empty。
public static string ToString(object value);
// 使用指定的区域性特定格式设置信息将指定对象的值转换为其等效的字符串表示形式。如果 value 为 null,则为 System.String.Empty。provider: 一个提供区域性特定的格式设置信息的对象。
public static string ToString(object value, IFormatProvider provider);