使用 XNA 建立遊戲/基礎知識/C#
使用 XNA 框架為 XBox 編碼時,我們將使用 C#(C Sharp)作為程式語言。C# 和 Java 非常相似,如果你瞭解其中一種,基本上你就瞭解了另一種。一個很好的 C# 入門教程是華夏公益教科書 C# 程式設計。
C# 有一些 Java 中沒有的功能,但是,如果你瞭解 C++,你會發現其中一些功能可能很熟悉。
- 屬性
- 列舉
- 裝箱和拆箱
- 運算子過載
- 使用者定義的轉換(強制轉換)
- 結構體
- 只讀欄位
C# 和 Java 之間最大的區別可能就是委託。它們用於事件、回撥和執行緒。簡而言之,委託就是函式指標。
這是一種為變數提供 getter 和 setter 方法的簡單方法。它在 Java 中沒有等效的功能,除非你認為 Eclipse 自動新增這些方法是等效的。只需考慮以下示例,注意 value 關鍵字的使用。
在 Java 中,你可以使用介面來儲存常量。在 C# 中,列舉型別用於此目的。請注意,它只能包含整型資料型別。
這對應於 Java 的包裝型別,現在也可用在 Java 中。有趣的是,原始型別和裝箱後的型別並不相同。還要注意,拆箱後的內容位於堆疊中,而裝箱後的內容位於堆中。
這是一個你可能從 C++ 中知道的特性,或者你可以考慮 Java String 類對 “+” 運算子的過載。在 C# 中,你可以過載以下運算子
- 一元運算子:+, -, !, +, ~, ++, --, true, false
- 二元運算子:+, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=
例如,對於向量和矩陣資料型別,過載 “+”、“-” 和 “*” 運算子是有意義的。
Java 有內建的強制轉換,C# 也有。此外,C# 允許隱式和顯式強制轉換,這意味著你定義強制轉換的行為。通常,這在類層次結構中的兄弟姐妹之間是有意義的。但是,有一個限制:不能重寫由類層次結構定義的轉換。
結構體基本上允許你定義行為類似於原始資料型別的物件。與儲存在堆中的物件不同,結構體實際上儲存在堆疊中。結構體與類非常相似,它們可以有欄位、方法、建構函式、屬性、事件、運算子、轉換和索引器。它們也可以實現介面。但是,也有一些區別
- 結構體不能從類或其他結構體繼承
- 它們沒有解構函式
- 結構體是按值傳遞而不是按引用傳遞
當我們討論 const 關鍵字時,與 Java 的 final 的區別在於,你必須在變數宣告時為其賦值。解決此問題的方法是使用 readonly 關鍵字。但是,它仍然有限制,即 readonly 變數必須在建構函式中初始化。
通常,在 Java 中,當你向方法傳遞某些內容時,它是一個變數或一個物件。現在,在 C# 中,也可以傳遞方法。這就是委託的意義所在。請注意,委託也是類。理解委託的一種好方法是將委託視為為方法簽名命名的東西。
除了普通的委託外,還有多播委託。如果委託的返回值型別為 void,它也可以成為多播委託。因此,如果委託是對一個方法的呼叫,那麼多播委託是對多個方法的呼叫,一個接一個地呼叫。
回撥方法在使用 C 或 C++ 程式設計時經常使用,它們非常有用。其理念是,與其等待另一個執行緒完成,不如只給該執行緒一個回撥方法,它可以在完成時呼叫該方法。當有一些需要很長時間才能完成的任務,而我們又希望使用者在此期間做其他事情時,這一點非常重要。為了實現這一點,C# 使用委託。
C# 中的面向物件概念與 Java 的非常相似。在語法方面有一些細微的差異。只有在繼承鏈中的方法覆蓋方面,C# 比 Java 提供了更大的靈活性。它允許對實際上將被呼叫的多型方法進行非常細粒度的控制。為此,它使用 “virtual”、“new” 和 “override” 關鍵字。在基類中,你需要將要覆蓋的方法宣告為 virtual。現在,在派生類中,你可以選擇將函式宣告為 “virtual”、“new” 或 “override”。