欢迎访问宙启技术站
智能推送

C#强制类型转化有几种

发布时间:2023-05-18 04:47:42

C# 是一门类型安全的语言,即变量必须在声明时指定其类型,并且不能改变类型。但有时候需要在不同类型之间进行转换,这时就需要用到类型转换。

C# 的强制类型转换有两种:显式类型转换和隐式类型转换。

## 隐式类型转换

隐式类型转换是指将一种类型的数据自动转换为另一种类型的数据,而不需要显式地声明。隐式类型转换通常是从小到大的转换。

例如,整型数据可以隐式转换为浮点型数据,因为浮点型数据范围更广:

int num = 10;
float floatNum = num;    // 隐式类型转换

又例如,在算术运算中,即使两个操作数的类型不同,也会自动进行类型转换:

int num = 10;
float floatNum = 1.2;
float result = num + floatNum;  // 隐式类型转换

在这个例子中,整型数据和浮点型数据进行了运算,但是结果在赋值给浮点型变量时自动被转换为浮点型。

## 显式类型转换

显式类型转换是指将一个类型的数据转换为另一个类型的数据,需要显式地进行类型转换。如果转换失败,会抛出异常。

### 整型转换

整型数据(byte、sbyte、short、ushort、int、uint、long、ulong)可以相互转换,但需要注意范围问题。如果将一个超过目标类型最大值的整数转换为目标类型,会导致数据溢出。下面是一些示例:

int num = 10;
byte byteNum = (byte)num;   // 显式类型转换
long longNum = num;        // 隐式类型转换
int maxInt = int.MaxValue;
short shortNum = (short)maxInt; // 范围问题,会造成数据溢出

### 浮点型转换

浮点型数据(float、double)也可以相互转换,但遵循的规则是精度和范围不会发生损失。

float floatNum = 1.2f;
double doubleNum = floatNum;    // 隐式类型转换
float result = (float)doubleNum;  // 显式类型转换

### 字符串转换

字符串数据可以转换为整数、浮点数、布尔值等类型,使用以下方法:

- int.Parse(string s):将字符串转换为整数;

- float.Parse(string s):将字符串转换为浮点数;

- bool.Parse(string s):将字符串转换为布尔值;

- Convert.ToInt32(string s):将字符串转换为整数;

- Convert.ToDouble(string s):将字符串转换为浮点数;

- Convert.ToBoolean(string s):将字符串转换为布尔值。

请注意,如果字符串不能转换为目标类型,会抛出异常。另外,Convert.ToInt32()Convert.ToDouble() 会返回目标类型的默认值,如果转换失败。

string str = "10";
int num = int.Parse(str);
float floatNum = float.Parse(str);
bool boolValue = bool.Parse("true");
int result = Convert.ToInt32("1000");
double doubleNum = Convert.ToDouble(str);
bool result2 = Convert.ToBoolean("false");

### 自定义类型转换

如果需要将一个自定义的类型转换为另一个自定义类型,可以使用运算符重载(Operator Overloading)实现类型转换。这个过程需要重载类型转换运算符(转换成为implicitexplicit)。

例如,将一个 Point 类型转换为 Vector 类型:

public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public static explicit operator Vector(Point p)
    {
        return new Vector(p.X, p.Y);
    }
}

public struct Vector
{
    public int X { get; set; }
    public int Y { get; set; }

    public Vector(int x, int y)
    {
        X = x;
        Y = y;
    }
}

Point point = new Point { X = 10, Y = 20 };
Vector vector = (Vector)point;  // 显式类型转换

在这个例子中,Point 类型重载了类型转换运算符,可以将 Point 类型转换为 Vector 类型的数据。

## 总结

类型转换是 C# 中非常常见的操作,可以通过隐式类型转换和显式类型转换实现。隐式类型转换是自动的,不需要显式声明,转换过程是从小到大的转换;而显式类型转换需要显式声明,会出现异常情况,转换过程需要从大到小转换。同时,我们还可以通过运算符重载实现自定义类型的转换。