目录

C# 基础:变量声明与类型转换

本章节详细讲解 C# 中的 `var` 隐式类型声明,以及不同数据类型之间的显式(强制)转换和隐式转换。

1. 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

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 的细微区别:

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);