====== C# 基础:变量声明与类型转换 ======
本章节详细讲解 C# 中的 `var` 隐式类型声明,以及不同数据类型之间的显式(强制)转换和隐式转换。
===== 1. var 隐式类型声明 =====
在 C# 中,`var` 关键字用于声明变量,但不需要明确指定数据类型。编译器会根据赋值符号右侧的数据自动推断出变量的类型。
**特点:**
* 必须在声明时初始化(赋值)。
* 一旦类型被推断确定,该变量的类型就固定了(强类型),不能再赋值为其他类型的数据。
* `var` 并非动态类型(dynamic),它是在编译时确定的。
// 传统声明
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
===== 30:显式/隐式转换 =====
在编程中,经常需要将一种数据类型转换为另一种数据类型。C# 提供了两种主要的转换机制。
==== 30-1: 区别 ====
^ 转换类型 ^ 描述 ^ 示例场景 ^ 安全性 ^
| **隐式转换** (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
==== 30-2: 转换函数 (Convert 类) ====
除了使用 `(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` |
==== 30-3: 转换案例详解 ====
以下是几种常见的具体转换场景及代码实现。
=== 30-3-1:Double 转 Int32 ===
使用 `Convert.ToInt32` 进行转换。
**注意:** 与 `(int)` 强制转换不同,`Convert.ToInt32` 会进行**四舍五入**(遵循银行家舍入法),而 `(int)` 是直接截断小数。
Double kar = 33.666;
// 使用 Convert 类
int num = Convert.ToInt32(kar);
// 结果 num 为 34 (四舍五入)
// 对比强制转换
int numCast = (int)kar;
// 结果 numCast 为 33 (截断)
=== 30-3-2:String 转 Int32 ===
将用户输入的字符串(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 的细微区别:**
* 如果字符串为 `null`:
* `Convert.ToInt32(null)` 返回 `0`。
* `int.Parse(null)` 抛出 `ArgumentNullException` 异常。
=== 30-3-3:Int 转 String ===
几乎所有数据类型都拥有 `.ToString()` 方法,用于将其转换为字符串表现形式。
int number = 123;
string text = number.ToString();
// 也可以在 ToString 中添加格式化参数
string money = number.ToString("C"); // 转换为货币格式,如 "¥123.00"
=== 30-3-4:String 转 UShort ===
将字符串转换为 `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);