Java 开发者学习 C# 的路线图
C# 和 Java 有许多相似之处。 学习 C# 时,可以应用许多已经掌握的 Java 编程知识:
- 类似的语法:Java 和 C# 都属于 C 语言系列。 这种相似性意味着你已经可以阅读并理解 C#。 虽然存在一些差异,但大部分语法与 Java 和 C 相同。大括号和分号的用法类似。
if
、else
、switch
等控制语句相同。 循环语句for
、while
和do
...while
相同。 在两种语言中,class
和interface
的关键字相同。 访问修饰符(包括public
和private
)相同。 甚至许多内置类型都使用相同的关键字:int
、string
和double
。 - 面向对象的范例:Java 和 C# 都是面向对象的语言。 多形性、抽象和封装的概念在这两种语言中都适用。 两种语言都添加了新构造,但核心功能仍然相关。
- 强类型化:Java 和 C# 都是强类型化语言。 可以显式或隐式声明变量的数据类型。 编译器会强制执行类型安全性。 在运行代码之前,编译器会捕获代码中与类型相关的错误。
- 跨平台:Java 和 C# 都是跨平台语言。 你可以在喜欢的平台上运行开发工具。 应用程序可以在多个平台上运行。 开发平台不需要与目标平台匹配。
- 异常处理:Java 和 C# 都通过引发异常来指示错误。 两者都使用
try
-catch
-finally
块来处理异常。 异常类具有类似的名称和继承层次结构。 一个区别是,C# 没有“已检查的异常”的概念。 任何方法(在理论上)都可能会引发任何异常。 - 标准库:.NET 运行时和 Java 标准库 (JSL) 支持常见任务。 两者都有适用于其他开源包的广泛生态系统。 在 C# 中,包管理器是 NuGet。 它类似于 Maven。
- 垃圾回收:这两种语言都通过垃圾回收来应用自动内存管理功能。 运行时从未引用的对象中回收内存。 一个区别在于,C# 支持创建值类型,就像
struct
类型一样。
由于这些相似性,几乎可以立即使用 C# 高效工作。 随着学习的深入,你应该会学到 Java 中没有的 C# 功能和习惯用法:
- 模式匹配:模式匹配可以根据复杂数据结构的形状提供简洁的条件语句和表达式。
is
语句检查变量“是否”为某种模式。 基于模式的switch
表达式提供了丰富的语法来检查变量并根据其特征做出决策。 - 字符串插值和原始字符串字面量:字符串插值使你能够在字符串中插入已评估的表达式,而不是使用位置标识符。 原始字符串字面量可用于最小化文本中的转义序列。
- 可以为 null 的类型和不可为 null 的类型:C# 通过向类型附加
?
后缀来支持可以为 null 的值类型和可以为 null 的引用类型。 对于可以为 null 的类型,如果在取消引用表达式之前不检查是否有null
,编译器会发出警告。 对于不可为 null 的类型,如果向该变量分配null
值,编译器会发出警告。 不可为 null 的引用类型可最大程度减少引发 System.NullReferenceException 的编程错误。 - 扩展方法:在 C# 中,可以创建扩展类或接口的方法。 扩展方法可扩展库中某个类型的行为或实现给定接口的所有类型的行为。
- LINQ:语言集成查询 (LINQ) 提供了一种通用语法来查询和转换数据,无论其存储方式如何。
- 本地函数:在 C# 中,可以在方法或其他本地函数内嵌套函数。 本地函数提供另一层封装。
C# 中还有一些 Java 中没有的功能。 你可看到 async
和 await
等功能,以及用于自动释放非内存资源的 using
语句。
C# 和 Java 之间还有一些类似的功能存在细微但重要的差异:
- 属性和索引器:属性和索引器(将类视为数组或字典)都具有语言支持。 在 Java 中,它们是以
get
和set
开头的方法命名约定。 - 记录:在 C# 中,记录可以是
class
(引用)类型,也可以是struct
(值)类型。 C# 记录可以是不可变的,但并非必须是不可变的。 - 元组在 C# 和 Java 中具有不同的语法。
- 属性类似于 Java 注释。
最后,有一些 Java 语言功能在 C# 中不可用:
- 已检查的异常:在 C# 中,理论上任何方法都可能引发任何异常。
- 已检查的数组协变:在 C# 中,数组不是安全协变的。 如果需要协变结构,则应使用泛型集合类和接口。
总的来说,有 Java 经验的开发者学习 C# 应该会很顺利。 你可发现非常熟悉的习惯用法,从而快速实现高效工作,并且很快就可学会新的习惯用法。