識別字(Identifier) 就相當於真實世界每個人的身分證號,程式設計時用這些識別字來呼叫該物件對象,所以我們必須為每一個變數、常數及函式命名,這些名稱稱為程式語言的識別字。命名的規則上一篇已經有提到,現在再來詳細介紹一下識別字與型別。
所謂的識別字,通常是有特別意義而存在,所以程式設計人員不可再重複定義該字串。而每套程式語言的關鍵字(保留字)就是系統預先定義好的識別字。例如:前面提到的int 或者 string,程式設計者需要依照用途使用,以下是C#語言常用的的保留字。
- 資料型別
又分為實值型別、參考型別、指標型別
A.實值型別 (Value Type) 的變數用來儲存資料。
主要包含兩大類:
struct (結構)、enum (列舉)。
而這兩大類中可以包含的資料又有三類:
Numeric (數字型別)、Boolean (布林值)、自定義結構。
數字型別是成員最多的一種,又分為…
整數:型別 範圍 大小 sbyte -128 至 127 帶正負號的 8 位元整數 byte 0 至 255 不帶正負號的 8 位元整數 char U+0000 至 U+ffff Unicode 16 位元字元 short -32,768 至 32,767 帶正負號的 16 位元整數 ushort 0 至 65,535 不帶正負號的 16 位元整數 int -2,147,483,648 至 2,147,483,647 帶正負號的 32 位元整數 uint 0 至 4,294,967,295 不帶正負號的 32 位元整數 long -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 帶正負號的 64 位元整數 ulong 0 至 18,446,744,073,709,551,615 不帶正負號的 64 位元整數 浮點數(帶有小數):
型別 大概範圍 精確度 float ±1.5e-45 至 ±3.4e38 7 位數 double ±5.0e-324 至 ±1.7e308 15-16 位數 Decimal(高精確十進位數):
類型 大概範圍 精確度 decimal
(-7.9 x 1028 至 7.9 x 1028) / (100 至 28) 28-29 個有效數字 布林:
一般來說bool 只有兩種情況 true、false (真、假 ,是、否),bool? 則可以帶有 null。
B.參考型別 (Reference Type) 的變數儲存實際資料的參考(物件)。
類別:
class 可以包含下列成員的宣告︰
建構函式、常數、欄位、完成項、方法、屬性、索引子、運算子、事件、委派、類別、介面、結構。
直接宣告或巢狀的 class 可存取權限是 public、protected internal
、protected、internal 或 private。 成員預設為 private。
在命名空間宣告的 class 可存取權限是 public 或 internal。 預設為 internal。
而繼承的規則僅允許繼承一個類別,但可以繼承多個介面繼承 範例 無 class ClassA { }
有 class ClassB : BaseClass { }
無,實作一個介面 class ClassC : IFace1{ }
有,實作三個介面 class ClassD : BaseClass, IFace1 , IFace2 , IFace3 { }
介面:
interface 只可以包含方法、屬性、事件或索引子。實作介面的類別或結構必須實作介面定義中的介面成員。
委派:
delegate 的宣告類似方法的格式,可以有傳回值或者任意類型之任何數目的參數引數。委派是事件的基礎可用來封裝具名或匿名方法的參考型別。//例如 //聲明委派定義 public delegate void TestDelegate(string s, long l); public delegate int TestDelegate(int i); class DelegateTest { // 常規方法宣告 static int Num(int input) { return input * 2; } static void Main() { // 使用命名方法實例化委派 TestDelegate td = Num; int multByTwo = td(5);// 調用td Console.WriteLine("multByTwo: {0}", multByTwo); // 匿名方法具現化委派 TestDelegate td2 = delegate(int input) { return input * input; }; int square = td2(5);// 調用td2 Console.WriteLine("square: {0}", square); // 使用拉姆達進行委派 TestDelegate td3 = t => t * t * t; int cube = td3(5); Console.WriteLine("cube: {0}", cube); } // Output: // multByTwo: 10 // square: 25 // cube: 125 }
物件:
object 型別在 .NET Framework 中是 Object 的別名。 在 C# 的型別系統中所有類型都會直接或間接繼承自 Object。class ObjectTest { public int i = 10; } class MainClass2 { static void Main() { object a; a = 1; // an example of boxing Console.WriteLine(a); Console.WriteLine(a.GetType()); a = new ObjectTest(); ObjectTest classRef; classRef = (ObjectTest)a; Console.WriteLine(classRef.i); } } /* Output 1 System.Int32 * 10 */
字串:
string 在 .NET Framework 中是 String 的別名。string 類型代表零或多個 Unicode 字元序列。string a = "hello"; string b = "world"; Console.WriteLine(a == b); Console.WriteLine(a + b);
空虛:
void 作為方法的傳回型別時,其可指定方法不要傳回值。
public void TestMethod() { // ....... }
動態:(UNITY不建議)
dynamic 型別可讓它發生所在的作業略過編譯時期型別檢查,延後到執行階段才解析辦別。class Test { void Main() { dynamic dyn = 1; object obj = 1; System.Console.WriteLine(dyn.GetType()); System.Console.WriteLine(obj.GetType()); } }
隱含型別:(UNITY不建議)
var 從 Visual C# 3.0 開始,在變數可使用隱含型別,由編譯器 (Compiler) 判斷型別。var i = 100; int i = 100;
C.指標型別 (Pointer Type) 只能用於 unsafe 模式。(不建議使用)
在 unsafe 狀態只能在非安全的程式區塊中用於明確的記憶體操作,而有非常多的平台或是網路串流是不支援的;類型有可能是指標類型、實值類型或參考類型。 指標類型宣告會使用下列其中一種格式:
sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool。
任何 enum 型別。任何指標類型。任何只包含 Unmanaged 類型欄位的使用者定義結構類型。type* identifier; void* identifier; //allowed but not recommended
宣告多個指標時,星號 (*) 只會與基礎類型一起出現,而不會做為每個指標名稱的前置詞使用。
int* p1, p2, p3; // Ok int *p1, *p2, *p3; // Invalid in C#
指標無法指向參考或包含參考的 struct,因為即使指標指向物件參考,依然可以對物件參考進行記憶體回收。 記憶體回收行程不會持續追蹤是否有任何指標類型指向物件。
myType*
類型的指標變數值是myType
類型變數的位址。 以下是指標類型宣告的範例:範例 說明 int* p
p
為整數的指標。int** p
p
為整數指標的指標。int*[] p
p
為整數的一維陣列指標。char* p
p
為字元的指標。void* p
p
為未知類型的指標。 - 預設值參考表
實值型別 預設值 bool false
byte 0 char ‘\0’ decimal 0.0M double 0.0D enum 由運算式 (E)0 所產生的值,而 E 是列舉識別項 float 0.0F int 0 long 0L sbyte 0 short 0 struct 這個值是由將所有實值型別欄位設定為其預設值,且所有參考型別欄位設定為 null
所產生uint 0 ulong 0 ushort 0 註:C# 不允許使用未初始化的變數。UNITY則OK。