本章节详细讲解 C# 中的 `var` 隐式类型声明,以及不同数据类型之间的显式(强制)转换和隐式转换。
在 C# 中,`var` 关键字用于声明变量,但不需要明确指定数据类型。编译器会根据赋值符号右侧的数据自动推断出变量的类型。
特点:
// 传统声明 int age = 25; string name = "Alice"; // var 声明 var i = 10; // 编译器推断 i 为 int 类型 var s = "Hello"; // 编译器推断 s 为 string 类型 var d = 10.5; // 编译器推断 d 为 double 类型 // 错误示例 // var x; // 报错:必须初始化 // i = "Text"; // 报错:无法将 string 隐式转换为 int
在编程中,经常需要将一种数据类型转换为另一种数据类型。C# 提供了两种主要的转换机制。
| 转换类型 | 描述 | 示例场景 | 安全性 |
|---|---|---|---|
| 隐式转换 (Implicit) | 系统自动完成,不需要特殊语法。通常发生在将小范围数据类型转换为大范围数据类型时。 | `int` 转 `double` | 安全,不会丢失数据精度。 |
| 显式转换 (Explicit) | 需要程序员手动编写代码(强制转换)。通常发生在将大范围数据类型转换为小范围数据类型时。 | `double` 转 `int` | 不安全,可能会丢失精度(如小数部分被截断)或溢出。 |
// --- 隐式转换示例 --- int i = 999; double d = i; // 因为 double 的取值范围涵盖了 int,所以系统自动转换 Console.WriteLine(d); // 输出 999 // --- 显式转换示例 --- double d2 = 888.20; // int i2 = d2; // 这样写会报错,因为 double 包含小数,int 装不下 int i2 = (int)d2; // 强制转换语法:(目标类型)变量 // 注意:强制转换通常会直接截断小数部分 Console.WriteLine(i2); // 输出 888
除了使用 `(type)` 进行强制转换外,C# 还提供了 `System.Convert` 类来进行类型转换。这通常用于处理实现了 `IConvertible` 接口的类型。
以下是常用的转换方法列表:
| 方法名 | 描述 | 对应 C# 类型 |
| :— | :— | :— |
| ToBoolean | 如果可能的话,把类型转换为布尔型 | `bool` |
| ToByte | 把类型转换为字节类型 | `byte` |
| ToChar | 把类型转换为单个 Unicode 字符类型 | `char` |
| ToDateTime | 把类型(整数或字符串)转换为日期-时间结构 | `DateTime` |
| ToDecimal | 把浮点型或整数类型转换为十进制类型(高精度) | `decimal` |
| ToDouble | 把类型转换为双精度浮点型 | `double` |
| ToInt16 | 把类型转换为 16 位整数类型 | `short` |
| ToInt32 | 把类型转换为 32 位整数类型 | `int` |
| ToInt64 | 把类型转换为 64 位整数类型 | `long` |
| ToSByte | 把类型转换为有符号字节类型 | `sbyte` |
| ToSingle | 把类型转换为单精度浮点数类型 | `float` |
| ToString | 把类型转换为字符串类型 | `string` |
| ToUInt16 | 把类型转换为 16 位无符号整数类型 | `ushort` |
| ToUInt32 | 把类型转换为 32 位无符号整数类型 | `uint` |
| ToUInt64 | 把类型转换为 64 位无符号整数类型 | `ulong` |
以下是几种常见的具体转换场景及代码实现。
使用 `Convert.ToInt32` 进行转换。 注意: 与 `(int)` 强制转换不同,`Convert.ToInt32` 会进行四舍五入(遵循银行家舍入法),而 `(int)` 是直接截断小数。
Double kar = 33.666; // 使用 Convert 类 int num = Convert.ToInt32(kar); // 结果 num 为 34 (四舍五入) // 对比强制转换 int numCast = (int)kar; // 结果 numCast 为 33 (截断)
将用户输入的字符串(String)转换为数值(Int)进行运算。主要有两种方式:`int.Parse()` 和 `Convert.ToInt32()`。
基本用法:
string num_string = "985"; // 方式 A: 使用 Parse int num1 = int.Parse(num_string); // 方式 B: 使用 Convert int num2 = Convert.ToInt32(num_string);
异常处理: 如果字符串包含非数字字符(如字母),转换会抛出异常。
string cong = "985a"; // 包含字母,不是纯数字 try { int kar = Convert.ToInt32(cong); } catch (FormatException) { Console.WriteLine("转换失败:输入字符串格式不正确"); }
Parse 与 Convert 的细微区别:
几乎所有数据类型都拥有 `.ToString()` 方法,用于将其转换为字符串表现形式。
int number = 123; string text = number.ToString(); // 也可以在 ToString 中添加格式化参数 string money = number.ToString("C"); // 转换为货币格式,如 "¥123.00"
将字符串转换为 `ushort` (无符号16位整数,范围 0 ~ 65535)。常用于读取端口号或特定硬件参数。
// 假设 read_L.Text 是一个文本框控件的属性 string inputText = "5000"; // 模拟读取到的文本 // 使用 Convert.ToUInt16 ushort read_wd_L = Convert.ToUInt16(inputText); // 或者使用 Parse ushort read_wd_L_Parse = ushort.Parse(inputText);