Administrator
发布于 2025-09-10 / 6 阅读
0
0

C#第3章: C#语言基础- 显式数据类型转换

## 一、数据类型转换运算符

数据类型转换运算符用于强制转换数据类型。

核心用途: 主要用于数值类型之间的转换,特别是缩小转换,或已知兼容的引用类型向下转换。

语法

```c#

(目标类型)表达式

```

- ( ) 是强制转换运算符

- 目标类型:运算符的参数,指定要转换到的类型

- (int) 表示"转换为int类型的操作"

- (double) 表示"转换为double类型的操作

- (string) 表示"转换为string类型的操作"

- 表达式:运算符的操作数,要被转换的值

特点:

- 编译时检查,运行时可能溢出

- 一元运算符:只需要一个操作数(在它右侧的值)

- 优先级较高:在表达式中优先于大多数算术运算符

- 右结合性:从右向左运算

用法概括

```c#

// 示例1:浮点数转整数(截断小数)

double price = 19.95;

int truncatedPrice = (int)price; // 结果为 19(直接丢弃小数部分)

// 示例2:大范围类型转小范围类型(可能溢出)

long bigNumber = 5000000000; // 50亿

int smallNumber = (int)bigNumber; // 结果为 705032704(溢出)

// 示例3:字符转整数(获取ASCII码)

char letter = 'A';

int asciiValue = (int)letter; // 结果为 65

// 示例4:枚举转整数

enum Status { Active = 1, Inactive = 0 }

int statusValue = (int)Status.Active; // 结果为 1

// 示例5:向下转换(需要类型兼容)

object obj = 42;

int numberFromObject = (int)obj; // 成功,因为obj实际是int

// 会失败的情况:

// string text = "123";

// int willFail = (int)text; // 编译错误:不能直接将string转换为int

```

### (int)表达式

用途:用于强制把目标类型转换为整型

(int)整数|实数|字符|枚举|object

```c#

//场景1:大转小(截断小数 精度丢失)

double d = 5.7;

int i = (int)d; //5

//场景2:大转小(数据溢出)

uint large = 4000000000;

int signed = (int)large; // -294967296 (溢出)

//场景3:字符串转整型(编译时类型检测)

string text = "123";

int number = (int)text; // 编译错误:不能直接将string转换为int

//场景4:字符转整型(获取ASCII码)

char letter = 'A';

int ascii = (int)letter; // 65

// 场景5:枚举转整数

enum Status { Active = 1, Inactive = 0 }

int statusValue = (int)Status.Active; //1

//场景6:引用类型(拆箱)

object obj = 42;

int number = (int)obj; // 42

```

### (char)表达式

用途:用于强制把目标类型(主要是数值类型)转换为字符型

```csharp

int code1 = 65;

char letter1 = (char)code1; // 'A'

int code2 = 97;

char letter2 = (char)code2; // 'a'

//超出char范围的转换

int largeNumber = 100000;

char largeChar = (char)largeNumber; // 会截断,可能得到意外字符

// 整数转字符(ASCII码)

int asciiCode = 65;

char letter = (char)asciiCode; // 'A'

Console.WriteLine($"{asciiCode} -> '{letter}'");

// 另一个示例

int code = 97;

char lowercaseA = (char)code; // 'a'

Console.WriteLine($"{code} -> '{lowercaseA}'");

// 浮点数转字符(先截断为整数)

double pi = 3.14;

char charFromDouble = (char)pi; // ASCII 3 → 不可见字符

Console.WriteLine($"π {pi} -> 字符代码: {(int)charFromDouble}");

// 注意:超出char范围的转换

int largeNumber = 100000;

char largeChar = (char)largeNumber; // 会截断,可能得到意外字符

Console.WriteLine($"{largeNumber} -> '{(int)largeChar}'");

```

### (string)表达式(特殊)

用途:用于强制把目标类型转换为字符串型

注意:(string)实际上不能用于大多数类型到字符串的转换!这是一个常见的误解。

```c#

object obj = "hello";

string str = (string)obj;

Console.WriteLine(str);//"hello"

// 这是错误的用法(会编译错误):

// int number = 42;

// string text = (string)number; // 编译错误!

// 正确的字符串转换应该使用:

int number = 42;

string text1 = number.ToString(); // "42"

string text2 = Convert.ToString(123); // "123"

string text3 = $"{456}"; // "456"

// (string)只能用于原本就是string类型或继承关系的对象

object obj = "Hello";

string str = (string)obj; // 正确,因为obj实际是string

// 或者用于自定义的显式转换运算符

```

### (double)表达式

用途:用于强制把目标类型转换为字符串型

```c#

// decimal → double(可能精度丢失)

decimal preciseValue = 123.4567890123456789m;

double approxValue = (double)preciseValue;

Console.WriteLine($"decimal: {preciseValue} -> double: {approxValue}");

// float → double(安全,但显式)

float floatValue = 3.14f;

double doubleValue = (double)floatValue; // 实际上可以隐式,但显式更明确

Console.WriteLine($"float: {floatValue} -> double: {doubleValue}");

// int → double(可以隐式,但显式也可用)

int wholeNumber = 42;

double asDouble = (double)wholeNumber; // 42.0

Console.WriteLine($"int: {wholeNumber} -> double: {asDouble}");

// 注意:从大范围到小范围

double bigDouble = 1.7E+308;

// float smallFloat = (float)bigDouble; // 可能溢出或精度严重丢失

```

### (float)表达式

用途:用于强制把目标类型转换为字符串型

```c#

double d = 3.14;

float f = (float)d;

Console.WriteLine(f.GetType()); // System.Single

double precise = 3.14159265358979;

float approximate = (float)precise; // 精度丢失

decimal money = 999.99m;

float moneyFloat = (float)money; // 999.99f

```

### (decimal)表达式

用途:用于强制把目标类型转换为decimal型

```c#

double d = 3.14;

decimal m = (decimal)d;

Console.WriteLine(m.GetType()); // System.Single

double d = 123.456;

decimal preciseDecimal = (decimal)d; // 123.456m

float f = 78.9f;

decimal fromFloat = (decimal)f; // 78.9m

```

### (long)表达式

用途:用于强制把目标类型转换为long型

```c#

double d = 3.14;

long l = (long)d;

Console.WriteLine(l.GetType()); // System.Single

ulong bigUnsigned = 18446744073709551615; // ulong.MaxValue

long signedLong = (long)bigUnsigned; // -1(溢出)

Console.WriteLine($"ulong: {bigUnsigned} -> long: {signedLong}");

double withFraction = 987654321.99;

long wholePart = (long)withFraction; // 987654321(截断)

```

### (byte)表达式

用途:用于强制把目标类型转换为字节整型

```c#

double d = 3.14;

byte b = (byte)d;

Console.WriteLine(b.GetType()); // System.Single

int largeNumber = 300;

byte smallByte = (byte)largeNumber; // 300 % 256 = 44

short mediumNumber = 128;

byte byteValue = (byte)mediumNumber; // 128

```

---

## 二、Parse方法

### int.Parse()

核心用途: 专门用于字符串到数值的转换,要求输入必须是严格格式化的数字字符串。

特点

- 仅用于字符串,严格格式

用法概括

```c#

Console.WriteLine();

Console.WriteLine((int)3.14);//3

Console.WriteLine(int.Parse("3"));//3

Console.WriteLine(int.Parse("-3"));//-3

// Console.WriteLine(int.Parse("3.14"));//Unhandled exception

// Console.WriteLine(.Parse("3.14"));//Unhandled exception

// 示例1:标准数字字符串

string validNumber = "123";

int parsedNumber = int.Parse(validNumber); // 成功:123

// 示例2:带空格的字符串(会自动处理前后空格)

string spacedNumber = " 456 ";

int parsedSpaced = int.Parse(spacedNumber); // 成功:456

// 示例3:会抛出异常的情况

try

{

string nullString = null;

int result1 = int.Parse(nullString); // ArgumentNullException

string invalidString = "123abc";

int result2 = int.Parse(invalidString); // FormatException

string tooBig = "9999999999";

int result3 = int.Parse(tooBig); // OverflowException

}

catch (Exception ex)

{

Console.WriteLine($"Parse失败: {ex.GetType().Name}");

}

```

---

## 三、Convert方法

特点

- 运行时检查,处理null值

### Convert.ToInt32() 方法

核心用途: 最通用的转换方法,可以处理多种输入类型,对null有默认处理。

用法概括

```c#

// 示例1:处理字符串(类似Parse)

string numberStr = "789";

int convertedNumber = Convert.ToInt32(numberStr); // 成功:789

// 示例2:处理null值(返回0)

string nullString = null;

int fromNull = Convert.ToInt32(nullString); // 结果为 0

// 示例3:处理其他基础类型

double d = 88.7;

int fromDouble = Convert.ToInt32(d); // 结果为 89(四舍五入)

bool flag = true;

int fromBool = Convert.ToInt32(flag); // 结果为 1

// 示例4:处理DBNull(数据库场景)

object dbNull = DBNull.Value;

int fromDbNull = Convert.ToInt32(dbNull); // 结果为 0

// 示例5:仍然会抛出异常的情况

try

{

string invalid = "abc123";

int result1 = Convert.ToInt32(invalid); // FormatException

decimal hugeValue = decimal.MaxValue;

int result2 = Convert.ToInt32(hugeValue); // OverflowException

}

catch (Exception ex)

{

Console.WriteLine($"Convert失败: {ex.GetType().Name}");

}

```

---

## 重要注意事项

  1. *(string)不能用于数值转字符串** - 使.ToString()Convert.ToString()

  2. 转换可能丢失数据 - 特别是大范围到小范围的转换

  3. 引用类型转换可能失败 - 使as运算符进行安全转换

  4. 自定义转换需要显式定义 - 通explicit operator关键字

  5. 考虑使用TryParse模式 - 对于可能失败的转换更安全


评论