Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

English Original

面向 C# 开发者的最佳实践

你将学到什么: 五个关键的思维转变、惯用的项目组织方式以及需要避免的常见错误。

难度: 中级

从 C# 转向 Rust 不仅仅是语法的改变,更是解决问题方式的一次深刻变革。这一章节总结了能够帮助你写出“原汁原味 (Idiomtic)” Rust 代码的最佳实践。


1. 思维方式的转变 (Mindset Shift)

出发点 (C#)目标地 (Rust)原因
垃圾回收 (GC)所有权/借用在没有 GC 的情况下实现可预测的性能和内存安全。
异常 (Exceptions)Result 类型显式的错误处理能让代码更加健壮和透明。
类继承 (Inheritance)Trait 组合组合比继承更灵活,且能有效避免复杂的层级堆叠。
可空类型 (Nullables)Option 类型在类型系统中彻底消灭“价值十亿美元的错误”——空引用。

2. 项目组织 (Project Organization)

以一种开发者感到熟悉但又符合 Rust 特性的方式来组织你的项目。

  • main.rs:你的程序入口(类似于 Program.cs)。
  • lib.rs:你的库逻辑核心(类似于独立的类库项目)。
  • models/:存放你的数据结构(POCOs)。
  • services/:存放你的业务逻辑模块。
  • tests/:用于存放集成测试代码。

3. 错误处理策略 (Error Handling Strategy)

不要在生产代码中使用 unwrap()。你应该使用 问号操作符 (?) 来将错误层层向上传递。

#![allow(unused)]
fn main() {
// 推荐做法:通过 ? 传播错误
pub fn load_config() -> Result<Config, io::Error> {
    let content = fs::read_to_string("config.json")?; // 如果文件不存在,立即返回 Err
    let config = serde_json::from_str(&content)?;
    Ok(config)
}
}

4. 避免 C# 开发者常犯的错误

1. 停止“疯狂克隆”

在 C# 中,几乎一切皆引用,因此“克隆”(即复制引用)的开销极低。但在 Rust 中,.clone() 会执行一次完整的数据深拷贝。

  • 坏习惯process_data(my_string.clone())
  • 好习惯process_data(&my_string)

2. 不要“硬刚”借用检查器

如果你发现自己被某个借用检查器的报错卡住了很久,通常这意味着你的数据所有权模型设计得不够合理。

  • 建议:与其尝试让应用程序的多个部分同时“拥有”同一个对象,不如尝试使用**“所有者/执行者 (Owner/Worker)”**模型,或者在确实需要跨线程共享时使用 Arc

C# 开发者总结表

  • 崇尚显式:Rust 倾向于显式编写的代码,而非隐藏的“黑盒魔法”(如隐式的 GC 或后台异常)。
  • 拥抱编译器:编译器是你最好的伙伴。如果它在向你“抱怨”,它其实是在尝试把你从一次潜在的运行时崩溃中拯救出来。
  • Trait 胜过继承:使用 Trait 来定义共享的行为规范,而不是使用基类。

练习:重构一段代码

挑战:将一段大量使用 unwrap() 的代码片段,重构为使用 Result? 操作符的形式。

关键理解:原汁原味的 Rust 代码是安全、可预测且极速的。通过遵循这些最佳实践,你将从“在用 Rust 写 C#”转变为编写真正的、高性能的 Rust。