C#与C的对比——以串口测试软件为例
本文将以一个实际的 C# WinForms 应用为例,深入浅出地讲解 C# 的关键语法和特性,帮助已经掌握 C 语言的开发者快速上手 C#。你将看到熟悉的结构,也将学习到 C# 独有的现代特性。
一、命名空间与引用
1. using 指令
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
- 类似于 C 中的
#include,用于引入命名空间。 - 可以引用系统库或第三方库。
- 避免重复输入全限定名,例如
System.Windows.Forms.Timer。
2. 命名空间定义
namespace spacemit_test
{
...
}
- 用于逻辑分组,防止命名冲突。
- 可以嵌套命名空间。
二、类的定义和面向对象
1. 类定义
public partial class Form1 : Form
public:访问限定符,表示在整个项目中可见。partial:类可以拆分成多个文件定义。Form:继承自 Windows 窗体基类(继承类似 C++)。
2. 成员变量与字段
private SerialPort serialPort = new SerialPort();
private bool macCheckResult = false;
private成员只能在类内部访问。- 字段可以直接赋初值。
- 默认值机制使得未赋值字段不会是未定义状态。
三、枚举与结构化数据
枚举类型
private enum TestStage
{
None,
NetMacCheck,
NetOperState,
NetSpeed,
SNCheck
}
- 类似 C 的
enum,但更强大。 - 可以作为类型使用,并支持强制转换。
- 默认从 0 开始,或可显式设值。
四、事件与委托
1. 事件绑定
responseTimer.Tick += ResponseTimer_Tick;
serialPort.DataReceived += SerialPort_DataReceived;
+=绑定事件处理器(委托)。- 类似 C 中的函数指针,但更安全。
Tick是一个定时器事件,DataReceived是串口事件。
2. 匿名函数与 Lambda 表达式
portRefreshTimer.Tick += (sender, e) => RefreshComPorts();
=>是 Lambda 表达式,简化代码。- 类似于 C++11 的 Lambda,但更常用。
五、UI 控件与事件驱动
事件处理函数
private void btnConnect_Click(object sender, EventArgs e)
- 所有关联控件点击等事件都走这里。
- 参数是事件发送者与参数包。
六、异常处理
try-catch 块
try
{
serialPort.Open();
}
catch (Exception ex)
{
MessageBox.Show($"连接失败: {ex.Message}");
}
- 类似
setjmp/longjmp,但更高级、结构化。 - 所有异常都是
Exception派生类。
七、字符串处理与正则表达式
var match = Regex.Match(line, @"link/ether\s+([0-9a-fA-F:]+)");
- C# 字符串功能强大,内建
string类。 - 正则表达式由
System.Text.RegularExpressions提供。
八、集合类型与泛型
private ConcurrentQueue<Tuple<DateTime, byte[], bool>> rawCommData;
- 使用
ConcurrentQueue<T>线程安全队列。 Tuple<T1, T2, T3>用于传递组合数据。- 泛型(Generics)类似于模板,但更安全、有约束。
九、异步编程与 async/await
private async void btnlogin_Click(object sender, EventArgs e)
{
await Task.Delay(1000);
}
await等待异步操作完成而不阻塞 UI。async关键字用于声明异步方法。- 替代回调函数和线程管理,简化异步流程。
十、字符串与 I/O
文件与目录操作
Directory.CreateDirectory(logDir);
File.WriteAllText(logFilePath, logEntry);
System.IO下的类提供文件操作方法。- 无需手动打开/关闭文件。
十一、窗体与界面
动态创建控件
var lblResult = new Label
{
Text = "PASS",
Font = new Font("微软雅黑", 24, FontStyle.Bold),
Dock = DockStyle.Fill
};
- 使用对象初始化器,简洁明了。
- 所有控件均为类实例,可动态布局。
十二、覆盖与生命周期
protected override void OnFormClosing(FormClosingEventArgs e)
override表示重写父类方法。- 类似 C++ 虚函数。
- 窗体关闭前执行清理逻辑。
十三、条件判断与字符串处理
if (!string.IsNullOrWhiteSpace(line))
{
snValid = snValue.Length == 20 && snValue.Substring(4, 12) == "MHK100161280";
}
- 字符串类提供丰富方法,如
Substring、Trim。 ==比较内容,而不是引用。&&、||等逻辑运算符与 C 相同,但true/false是布尔类型。
十四、其他语法
1. 三元运算符
string status = isPass ? "PASS" : "FAIL";
- 与 C 完全一致。
2. 内插字符串
$"MAC地址: {(macCheckResult ? "PASS" : "FAIL")} ({macValue})"
- 使用
$""和{}实现字符串拼接。 - 替代繁琐的
string.Format()。
十五、总结:C# 相比 C 的提升
| 特性 | C | C# |
|---|---|---|
| 字符串处理 | 手动管理(指针) | 内建 String 类 |
| 异常处理 | errno / 返回值 |
try-catch 结构 |
| UI 编程 | 第三方库 | 原生支持 WinForms/WPF |
| 泛型 | 无 | 泛型类与方法 |
| 线程与异步 | pthread / 手动控制 | Task、async/await |
| 内存管理 | 手动 malloc/free |
自动 GC |
| OOP | 无 | 原生支持类、继承、多态 |
留下评论