1 分钟阅读 次阅读

本文将以一个实际的 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";
}
  • 字符串类提供丰富方法,如 SubstringTrim
  • == 比较内容,而不是引用。
  • &&|| 等逻辑运算符与 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 原生支持类、继承、多态

标签:

分类:

更新时间:

留下评论