如果你剛開始一份新工作或加入使用 C# 的團隊,這篇文章能幫助你快速提升生產力。 它突顯了 Java 熟悉的部分與 C# 的新內容。
C# 和 Java 有許多相似之處。 當您學習 C# 時,您可以應用從 Java 程式設計中已獲得的大部分知識:
-
類似的語法:Java 和 C# 都屬於 C 語言系列。 這種相似性表示您已經可以閱讀並了解 C#。 雖然有些差異,但大部分的語法與 Java 和 C 相同。大括弧和分號是熟悉的東西。
if、else、switch等控制陳述式是相同的。for、while和do...while的迴圈陳述式相同。 兩種語言中的class和interface的關鍵字是相同的。 從public到private的存取修飾詞是相同的。 甚至許多內建型別也使用相同的關鍵字:int、、stringdouble和 。 - 物件導向範式:Java 和 C# 都是物件導向語言。 多型、抽象和封裝的概念在這兩種語言中都適用。 兩者都新增了新的建構,但核心功能仍然相關。
- 強型別:Java 和 C# 都是強型別語言。 您可以明確或隱含宣告變數的資料類型。 編譯器會強制執行型別安全。 在您執行程式碼之前,編譯器會攔截程式碼中與型別相關的錯誤。
- 跨平台:Java 和 C# 都是跨平台的。 您可以在您偏好的平台上執行您的開發工具。 您的應用程式可以在多個平台上執行。 您的開發平台不需要符合您的目標平台。
-
例外狀況處理:Java 和 C# 都會擲回例外狀況以指出錯誤。 兩者都會使用
try-catch-finally區塊來處理例外狀況。 Exception 類別具有類似的名稱和繼承階層。 其中一個差異是 C# 沒有檢查型例外狀況的概念。 理論上,任何方法都可能會拋出任何例外狀況。 - 標準程式庫:.NET 執行階段和 Java 標準程式庫 (JSL) 都支援一般工作。 兩者對於其他開放原始碼套件都有廣泛的生態系統。 在 C# 中,套件管理員是 NuGet。 它類似於 Maven。
-
記憶體回收:兩種語言都透過記憶體回收採用自動記憶體管理。 執行階段會從未被引用的物件中回收記憶體。 其中一個差異是 C# 可讓您建立實值型別,類似於
struct型別。
語法一覽
以下範例並排展示幾個常見的模式。 這些比較雖然不算全面,但能讓你快速感受到語法差異。
變數宣告與型別推論:
// Java
var name = "Hello";
final int count = 5;
// C#
var name = "Hello";
const int count = 5;
字串插值:
// Java
var message = "Hello, " + name + "! Count: " + count;
// C#
var message = $"Hello, {name}! Count: {count}";
了解更多: 字串插值
Lambda 表達式:
// Java
list.stream().filter(x -> x > 5).collect(Collectors.toList());
// C#
var result = list.Where(x => x > 5).ToList();
了解更多: LINQ 概述
空值處理:
// Java
String value = optional.orElse("default");
// C#
string value = input ?? "default";
了解更多: 可空參考型別
什麼是熟悉的
由於相似之處,您幾乎可以立即在 C# 中提高生產力。 隨著進度進展,學習 Java 沒有的 C# 功能和慣用語:
-
模式比對:模式比對可根據複雜資料結構的形狀來實現簡潔的條件陳述式和運算式。
is陳述式會檢查變數是否「是」某種模式。 以模式為基礎的switch運算式可提供豐富的語法來檢查變數,並根據其特性來做出決定。 - 字串插值和原始字串常值:字串插值可讓您在字串中插入評估的運算式,而不是使用位置識別碼。 原始字串提供一種將文字中的跳脫字元序列降到最低的方式。
-
可為 Null 和不可為 Null 的型別:C# 會透過將 後綴附加到型別來支援可為 Null 的實值型別和
?。 對於可為 Null 的型別,如果您在取消參考運算式之前不檢查null,則編譯器會警告您。 對於不可為 Null 的型別,如果您可能會對該變數指派null值,則編譯器會警告您。 不可為 Null 的參考型別會將擲回 System.NullReferenceException 的程式設計錯誤降到最低。 - 延伸模組:在 C# 中,您可以建立 擴充 類別或介面的成員。 擴展可為某個庫中的某類型或實作指定介面的所有類型,提供新行為。
- LINQ:Language Integrated Query (LINQ) 可提供一般語法來查詢和轉換資料,無論其儲存方式如何。
- 本機函式:在 C# 中,您可以在方法或其他本機函式內套疊函式。 本地函數提供了更進一步的封裝和隔離層。
小提示
想了解更多關於 C# 類型系統——包括 struct vs. class、記錄和介面——請造訪基礎部分的 類型系統 概覽。
C# 中還有一些 Java 中沒有的功能。 具有像 async 和 await 這樣的功能,可在循序語法中模擬異步操作。 該 using 敘述會自動釋放非記憶體資源。
C# 和 Java 之間也有一些相似的功能,存在細微但重要的差異:
-
屬性 (Properties)和索引子:屬性和索引子 (將類別視為陣列或字典) 都具有語言支援。 在 Java 中,它們都是以
get和set開頭的方法的命名慣例。 -
記錄:在 C# 中,記錄可以是
class(參考) 或struct(值) 型別。 C# 記錄可以是不可變的,但不要求是不可變的。 - 元組在 C# 和 Java 中具有不同的語法。
- 屬性 (Attributes) 類似於 Java 註釋。
最後,還有一些 C# 中沒有的 Java 語言功能:
- 檢查型例外狀況:在 C# 中,任何方法理論上都可能會擲回任何例外狀況。
- 檢查型陣組共變數:在 C# 中,陣列不是安全的共變數。 如果您需要共變結構,則應使用泛型集合類別和介面。
整體而言,對於有 Java 經驗的開發人員來說,學習 C# 應該會很順利。 C# 有足夠的熟悉慣用語,可讓您在學習新的慣用語時提高生產力。
後續步驟
- C# 概覽:提供 C# 所有功能的高階概覽。
- 初學者教學:透過互動課程逐步學習 C#。
- 你可以用 C# 建置什麼:探索你可以用 C# 建立的應用程式類型。
- C# 基礎:深入學習型別系統、物件導向程式設計等。