深入探討變數、型別和方法
正確撰寫 C# 程式碼
基本語法規則
程式碼行就像句子一樣,需要有某種分隔或結束字符。每一行 C# 程式碼(稱為陳述式)必須以分號結尾,以便程式碼編譯器處理。
例如,一個簡單的變數可以這樣寫:
```csharp
public string FirstName = "Harrison";
```
或者也可以寫成:
```csharp
public
string
FirstName
=
"Harrison";
```
這兩種寫法對 Visual Studio 來說都是可接受的,但第二種寫法在軟體開發社群中是不被鼓勵的,因為這會使程式碼非常難以閱讀。
大括號的使用
第二個需要記住的格式規則是大括號(curly brackets)的使用: {}。方法、類別和介面在宣告後都需要一組大括號。
C# 的傳統做法是將每個括號放在新的一行,如下所示:
```csharp
public void MethodName()
{
}
```
不過你可能也會看到第一個大括號與宣告放在同一行:
```csharp
public void MethodName() {
}
```
程式碼除錯
Debug 方法
當我們需要將資訊和回饋輸出到 Unity 編輯器的 Console 視窗時,可以使用以下方法:
1. 對於簡單文字或單個變數,使用標準的 Debug.Log() 方法:
```csharp
Debug.Log("文字在這裡");
Debug.Log(CurrentAge);
```
2. 對於更複雜的除錯,使用 Debug.LogFormat():
```csharp
Debug.LogFormat("文字在這裡,添加 {0} 和 {1} 作為變數佔位符", CurrentAge, FirstName);
```
理解變數
變數宣告
變數宣告必須遵循以下要求:
- 必須指定變數將儲存的資料類型
- 變數必須有唯一名稱
- 如果有指派值,必須與指定的類型相符
- 變數宣告需要以分號結尾
基本語法為:
```csharp
dataType UniqueName = value;
```
類型和值的宣告
最常見的創建變數場景是在宣告時就有所有必要資訊。例如:
```csharp
int CurrentAge = 32;
```
僅類型宣告
有時你可能只知道變數的類型和名稱,但尚不知道其值:
```csharp
int CurrentAge;
```
存取修飾詞的使用
變數可以包含存取修飾詞(如 public),完整的語法為:
```csharp
accessModifier dataType UniqueName = value;
```
任何未標記為 public 的變數預設為 private,且不會在 Unity Inspector 面板中顯示。
存取修飾詞詳解
在 C# 中有四種主要的存取修飾詞,但作為初學者,你最常用到的是以下兩種:
1. **Public**
: 任何腳本都可以無限制地訪問
2. **Private**
: 只能在它們被創建的類別(稱為包含類別)中訪問。任何沒有存取修飾詞的變數預設都是 Private
另外兩種進階的修飾詞特性如下:
- **Protected**
: 可從其包含類別或衍生自該類別的型別中訪問
- **Internal**
: 只能在當前組件中使用(組件是自動生成的檔案,它將程式碼、資源等所有內容打包在一起)
讓我們實際試試看存取修飾詞! 就像現實生活中的資訊一樣,某些資料需要被保護或只與特定人分享。如果變數不需要在 Inspector 視窗中更改或被其他腳本訪問,它就適合使用 private 存取修飾詞。
更新 LearningCurve 的步驟:
1. 將 CurrentAge 前面的存取修飾詞從 public 改為 private 並儲存檔案
2. 回到 Unity,選擇 Main Camera,觀察 LearningCurve 部分的變化
由於 CurrentAge 現在是 private,它在 Inspector 視窗中不再可見,只能在 LearningCurve 腳本中通過程式碼訪問。點擊 Play 後,腳本仍會和之前一樣運作。
使用型別
在變數中指定特定型別是一個重要的選擇,它會影響變數整個生命週期中的每一個互動。由於 C# 是所謂的強型別(strongly typed)或型別安全(type-safe)語言,每個變數都必須有一個資料型別,沒有例外。相比之下,像 JavaScript 這樣的程式語言是非型別安全的。
常見的內建型別
C# 中的所有資料型別都源自(或稱為衍生自)一個共同的祖先: System.Object。這種層次結構稱為通用型別系統(Common Type System, CTS),意味著不同型別有許多共享的功能。以下是一些最常見的資料型別選項:
```csharp
public class LearningCurve : MonoBehaviour
{
private int CurrentAge = 30;
public int AddedAge = 1;
public float Pi = 3.14f;
public string FirstName = "Harrison";
public bool IsAuthor = true;
void Start()
{
ComputeAge();
Debug.Log($"A string can have variables like {FirstName} inserted directly!");
}
void ComputeAge()
{
Debug.Log(CurrentAge + AddedAge);
}
}
```
注意事項:
- 處理字串型別時,實際的文字值需要放在一對雙引號內
- float 值需要以小寫 f 結尾,如 Pi 的例子所示
- bool 變數在 Unity 中顯示為核取方塊(勾選表示 true,未勾選表示 false)
字串插值
數字型別的行為與你在學校學到的數學一樣,但字串有所不同。通過在開頭加上 $ 字元(稱為字串插值),可以直接在文字中插入變數和字面值。你已經在 LogFormat() 除錯中使用過插值字串,加上 $ 字元讓你可以在任何地方使用它們!
字串插值示例:
```csharp
Debug.Log($"A string can have variables like {FirstName} inserted directly!");
```
型別轉換
由於變數只能保存其宣告型別的值,但有時我們需要組合不同型別的變數。在程式設計術語中,這些稱為轉換,主要有兩種:
1. **隱式轉換**:自動進行,通常是當較小的值可以無需四捨五入就能放入另一個變數型別時:
```csharp
int MyInteger = 3;
float MyFloat = MyInteger; // 自動轉換為 3.0f
Debug.Log(MyInteger); // 顯示 3
Debug.Log(MyFloat); // 顯示 3
```
2. **顯式轉換**:當轉換過程中可能會丟失變數資訊時需要進行。例如,將 double 值轉換為 int 值時,需要通過在要轉換的值前加上目標型別的括號來明確轉換:
```csharp
int ExplicitConversion = (int)3.14; // 結果為 3
```
推斷宣告
C# 可以從指派的值推斷變數的型別。例如,var 關鍵字可以讓程式知道資料型別需要由其值來決定:
```csharp
var CurrentAge = 32; // 推斷為 int 型別
```
雖然這在某些情況下很方便,但不建議過度使用推斷變數宣告。這會讓你的程式碼增加許多猜測的成分,而程式碼應該要清晰明確。推斷變數宣告真正應該只在測試程式碼且不知道儲存的資料型別時使用。一旦知道了資料型別,建議將變數宣告改為特定型別以避免後續的執行時期錯誤。