【C#】通用类型转换

  • 自动类型转换(隐式类型转换)
  • 强制类型转换(显式类型转换)
  • 通过函数进行转换(通过方法进行类型转换)
  • 使用 as 操作符转换
  • 通用类型转换方法实现


数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。

自动类型转换(隐式类型转换)

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

例如:

int i = 100;
double d = i;

敲黑板:

  1. 转换前后的类型必须相兼容 例如:int和double
  2. 隐式数值转换实际上就是从低精度的数值类型到高精度的数值类型的转换,即小的类型转大的类型

强制类型转换(显式类型转换)

与自动转换正好相反,强制转换需要用户明确地指定转换的类型。显式转换包括所有的隐式转换,也就是说把任何系统允许的隐式转换写成显式转换的形式都是允许的
例如:

double d = 100.00;
int i = (int)d;

敲黑板:

  1. 显式转换可能会导致错误。进行这种转换时编译器将对转换进行溢出检测。如果有溢出说明转换失败,就表明源类型不是一个合法的目标类型。无法进行类型转换。
  2. 强制类型转换会造成数据精度丢失。

通过函数进行转换(通过方法进行类型转换)

函数转换,顾名思义通过编写类型处理方法的形式达到转换类型的目的。

int i;
string str = "100";
i = int.Parse(str);
int.TryParse(str, out i); // 推荐使用,对比 int.Parse(str) 多了异常处理增强了代码的健壮性
  • 常用类型转换方法

方法

说明

ToString

C# 基类型是 Object 所以所有的类型都有 ToString()。转字符串类型

Convert.ToChar

转换为字符型(char)

Convert.ToString

转换为字符串型(string)

Convert.ToDateTime

转换为日期型(datetime)

Convert.ToDouble

转换为双精度浮点型(double)

Conert.ToSingle

转换为单精度浮点型(float)

Convert.ToBase64CharArray

将数组中的项进行 Base64 编码

Convert.ToBase64String

将字符串进行 Base64 编码

Convert.ToBoolean

转换为布尔类型(bool)

Convert.ToDecimal

转换为等效的十进制数

Convert.ToSByte

转换为 8 位带符号整数

Convert.ToInt32

转换为 32 位带符号整数

Convert.ToInt16

转换为 16 位带符号整数

Convert.ToInt64

转换为 64 位带符号整数

Convert.ToByte

转换为 8 位无符号整数

Convert.ToUInt16

转换为 16 位无符号整数

Convert.ToUInt32

转换为 32 位无符号整数

Convert.ToUInt64

转换为 64 位无符号整数

使用 as 操作符转换

使用 as 操作符具有 高效安全 的特点:
  as 操作符不会做过的转换操作,当需要转化对象的类型属于转换目标类型或者转换目标类型的派生类型时,那么此转换操作才能成功,而且并不产生新的对象当不成功的时候,会返回 null
  当用 as 操作符进行类型转换的时候,首先判断当前对象的类型,当类型满足要求后才进行转换,而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要手动加上try-catch,所以相对来说,as 效率高。

敲黑板:

  1. as 转换不成功会返回 null 因此在无法确定转换结果的情况下一定一定要进行判空。
  2. as 也有一定的限制:
  • 不用在类型之间进行类型转化
  • 不能应用在值类型数据 - 只支持引用类型

通用类型转换方法实现

通用类型转换方法本质还是方法进行类型转换的方式,确切来说是 Convert 的形式。
不同于现有的转换方法有固定的类型,通用型是通过 泛型 约束来定义目标转换类型。并且使用扩展方法的形式是的调用起来非常的容易,且可以进行链式编程。

public static class Extensions
{
    public static T Parse<T>(this object value, T defaultValue = default)
    {
        var type = typeof(T);
        try
        {
            var nullableType = Nullable.GetUnderlyingType(type);

            if (nullableType is null)
                return (T)Convert.ChangeType(value, type);

            return (T)Convert.ChangeType(value, nullableType);
        }
        catch
        {
            return defaultValue;
        }
    }
}

备注

  • 还可以通过继承接口 IConventible 或者 TypeConventer 类,从而实现自己的转换。