當優美的C#與Unity3D結合時開發遊戲變的超Esey(一)必須掌握的C#100個基本點。
Unity3D提供支援三種指令碼語言,但是Jscript並非一我們所熟知的那個Jscript,有著很大的不同,所以建議使用優美的C#語言來寫指令碼,下面是必須掌握的100個C#基本點。
1.C#中使用//(雙斜槓)來表明本行的剩餘部分代表註釋。
2.C#中語句是按順序執行的,每條語句以分號結尾。
3.C#中的函式執行一系列語句的行為,稱為語句塊---一對大括號中包含0條或多條語句。
4.一個函式可以通過定義引數來從呼叫者處接受輸入資料,也可以通過定義返回型別來輸出資料給呼叫者。
5.Main函式定義為執行程式的預設入口點。Main函式可以不返回任何值,也可以返回一個整數給執行程式環境。Main函式也可以不定義任何引數,或者定義一個string陣列作為引數(該引數將由傳遞給執行程式的引數填充)。
6.Using指令用於使用名稱空間。
7.C#中的識別符號以字母或下劃線開頭,並且大小寫敏感。
8.關鍵字是由編譯器保留的名字,不能用作識別符號,下面是C#的關鍵字列表:
9.如果想將關鍵字作為識別符號,那麼可以加上字首@以使它合法,例如:class @class。注意@符號並不構成識別符號的一部分,所以@myVariable和myVariable是相同的。
10.一些關鍵字是上下文相關的,它們不用使用符號@就能夠被用作識別符號。這些關鍵字如下:
11.C#中所有的值都是一個特定型別的例項,一個值的含義,以及一個變數可以擁有的所有可能的值,是由它的型別決定的。
12.預定義型別(也叫內建型別)是被編譯器特別支援的型別,如int、float、bool等。
13.自定義型別可以包含成員資料和成員函式。需要使用new運算子來建立一個新的自定義型別的例項,當new運算子例項化一個物件後,該物件的建構函式將被呼叫。建構函式的定義類似於普通函式定義,除了函式名必須和類名相同以及去除了返回型別。
14.在型別的例項上操作的資料成員和函式成員稱為例項成員。而不在型別的例項上,但在型別本身上操作的資料成員和函式成員,必須被標記為static。
15.public關鍵字用於顯露成員給其他類使用。
16.C#能夠在兩個相相容的型別之間進行轉換,轉換總是根據一個已存在的值而建立一個新值。轉換可以是隱式的或者顯式的,隱式的轉換自動發生,如int x = 5; long y = x。而顯式的轉換需要一個對映,如int x = 5; short y = (short)x。一般來說,當編譯器能夠保證在兩個型別之間轉換總是成功的,且不丟失任何資訊,那麼就允許隱式轉換,否則的話,就必須使用顯式轉換。
17.C#中的型別可以分為值型別和引用型別。值型別包括了大多數內建型別(所有的數值型別(int, float等),char型別,bool型別以及struct與enum型別),引用型別包括了所有的class,array,delegate與interface型別。
18.一個值型別的變數或常量包含的內容僅僅是一個值,對一個值型別的例項進行賦值總是會拷貝實際資料到該例項。引用型別的變數或常量包含的內容是對一個擁有實際資料的物件的引用,對一個引用型別的例項進行賦值總是會拷貝引用,而不會拷貝擁有實際資料的物件例項,這就允許多個變數引用同一個物件。
19.一個引用型別的例項可以被設定為null,以表明沒有引用任何物件,使用一個為null的例項的成員將產生一個執行時錯誤。相比之下,一個值型別的例項不能被設定為null。
20.C#中的預定義型別分類:
21.C#預定義的數字型別如下:
22.整型可以使用10進位制或16進位制標記法,16進位制標記法需要加0x字首,如0x7F。實數可以用10進位制或指數標記法,如1e06。
23.浮點數轉換為整數將丟棄小數部分,如果想要進行四捨五入的轉換,則可以使用System.Convert類。
24.需要注意從1個很大的整數轉換為浮點數時可能會丟失精度,如int x = 100000001; float f = x; // 此時f = 100000000。
25.算數運算子(+,-,*,/,%)可以用於所有的數值型別(除了8位和16位的整數型別)。
26.自增,自減運算子用於使數值型別的變數加1或減1。運算子可以放在變數前(++x)或者變數後(x++),取決於想在表示式計算之前還是之後更新變數的值。
27.整數除法總是會丟棄餘數。如果除以一個值為0的變數將產生一個執行時錯誤(DivideByZeroException),除以字面值0將產生編譯錯誤。
28.在執行時,整數型別進行算術運算可能會造成溢位,預設情況下,不會有異常被丟擲。C#文件表明對於溢位結果是不可預料的,但是Common Language Runtime(CLR)總是產生一個wraparound行為,也就是說,將最小的int值減1的結果是最大的int值,如int x = int.MinValue; x--; // 此時x = int.MaxValue。
29.checked運算子通知執行時當溢位時丟擲一個OverflowException異常,checked運算子可以用於++, --, -(一元), +, -, *, /以及整數型別之間的顯示轉換。checked運算子可以用於一個表示式或者一個語句塊,如:
1 int a = 1000000; 2 int b = 1000000; 3 int c = checked( a * b ); // 用於表示式4 5 checked 6 { 7 c = a * b; // 用於語句塊8 }
可以使用/checked[+/-]編譯選項來檢測/不檢測程式中所有發生的溢位,如果使用了/checked+來檢測程式中所有發生的溢位,而對於某些特定的表示式或語句塊又不想使用檢測功能,那麼可以像checked運算子一樣使用unchecked運算子來關閉檢測。
30.C#提供了下面這些位運算子:
31.8位和16位的整型包括了byte, sbyte, short和ushort,這些型別自身沒有算數運算子,所以C#在需要時會將它們轉換為更大的型別,這樣就會導致如果接收運算結果的是一個較小的整型時,會發生編譯錯誤,如short x = 1, y = 1; short z = x + y; // 此處編譯錯誤。在這種情況下,為了使加法能夠執行,x, y會被隱式的轉換為int,這意味著結果也是int,而int不能被隱式的轉換為short(因為會導致資料丟失),所以,為了使編譯通過,我們需要加上顯式轉換,short z = (short)(x + y);
32.float和double類有一些常量用於NaN(Not a Number), +∞, -∞, MaxValue, MinValue和Epsilon。當發生除0時將導致結果為無窮值,如:
。當發生0除0或者無窮減無窮時將導致結果為NaN,如
。當使用==時,一個NaN值永遠不會等於另一個值,即使是另一個NaN值,所以如果要測試一個值是否為NaN,必須使用float.IsNaN或者double.IsNaN函式。當使用Object.Equals函式時,也可以判斷兩個NaN值是否相等,如object.Equals (0.0/0.0, double.NaN) // true。
33.float型別適用於科學計算,而decimal型別適用於金融計算或者表示那些人為的值,下面是double型別與decimal型別的區別:
34.由於float和double型別的數值在內部是以2為基表示的,所以許多以10為基的小數部分字面值無法被精確的表示,如
,這就是為什麼float和double型別不適用於金融計算的原因。相比之下,由於decimal型別的數值是以10為基表示的,所以這種情況不會出現。
35.C#的bool型別是一個可以被指定為true或者false的邏輯值。儘管一個bool型別僅需要1位的儲存空間,但是執行時將使用1個位元組的儲存空間,因為這是執行時和處理器可以有效工作的最小單位。所以為了避免空間上的浪費,C#提供了一個BitArray類,該類位於System.Collections名稱空間下,旨在只使用1位儲存空間表示每個bool型別的值。
36.對於引用型別,是否相等,預設情況下是取決於所引用的物件是否相同,而不是物件內部的實際資料。因此,一個物件的兩個擁有相同資料的例項被認為是不相等的,除非該物件所屬的型別過載了==運算子以達到使他們相等的效果。
37.相等和比較運算子,==, !=, <, >, <=, >=,可以用於所有的數值型別,但是用於實數時需要謹慎小心(參見34)。這些運算子也可以用於enum(列舉)型別成員,比較的是他們代表的整型數值。
38.&&和||運算子用於測試條件與和條件或,他們是短路運算子,也就是說,當前一個表示式不滿足時,後續表示式將不再計算,如if ( a && b ),如果表示式a為假,那麼表示式b將不會計算,這是十分有用的,例如:if (sb != null && sb.Length > 0),可以避免丟擲NullReferenceException異常。&和|運算子也可用於測試條件與和條件或,但是他們不是短路運算子,所以,一般很少用於條件測試。還有一個三目運算子,形式如q ? a : b,當q為真時,a將被計算,否則b將被計算。
39.C#的char型別代表一個Unicode字元,佔用2個位元組。一個char的字面表示在一個單引號中,如char c = 'A';轉義字元用來表示那些不能顯示的字元,一個轉義字元是一個反斜槓緊跟一個字元,具有特定的含義,轉義字元表如下:
。\u(或\x)轉義字元允許你通過使用4位16進位制來指定任意的Unicode字元,如char newLine = '\u000A';
40.當一個數值型別可以容納一個unsigned short型別的值時,從char到該數值型別就可以隱式轉換。否則的話,就需要顯示轉換。
41.string型別表示一個不可變的Unicode字元序列。一個string的字面表示在一個雙引號中,如string s = "hello";儘管string是引用型別,而不是值型別,但是它的==運算子卻遵循值型別的比較語義,如string a = "test", b = "test"; Console.Write (a == b); // True。轉義字元同樣也可以用在string型別中,如string a = "\\\\server\\fileshare";C#還提供逐字字串字面值,以@開頭並且不再解析轉義字元,如string b = @"\\server\fileshare";和上面的字串a是等價的。
42.+運算子用於連線兩個字串,如string a = "s" + "w";可能某個運算元不是string型別,那麼該運算元型別的ToString函式將被呼叫,如string a = "s" + 5;等價於string a = "s" + 5.ToString();因為string型別是不可變的,所以多次的使用+運算子構建一個新的string是十分低效的。取而代之的,可以使用System.Text.StringBuilder型別,這代表了一個可變的字串,以及擁有可以高效的新增,刪除,插入,替換子串的方法。
43.string型別不支援<和>運算子來進行比較操作,必須使用string型別的CompareTo函式。
44.字串的索引返回特定位置上的字元,如Console.Write ("word"[2]); // r。
45.切記:string型別代表的字串是不可變的,所有操作字串的函式將返回一個新的字串,原來的字串不會被改變。
46.一個數組(Array)代表一個特定型別的固定數量的元素。一旦陣列被建立,它的長度就不能被改變了。陣列元素總是被儲存在連續的記憶體塊中,以供高效的存取。一個數組以元素型別緊跟方括號來表示,如char[] vowels = new char[5]; 方括號也用於陣列索引,存取一個特定位置的元素,如vowels[0] = 'a'; 在執行時所有的陣列索引都會進行範圍檢測,如果使用了一個無效的索引,那麼將丟擲一個IndexOutOfRangeException異常。
47.陣列的初始化表示式可以方便的同時宣告和賦值一個數組,如char[] vowels = new char[] {'a','e','i','o','u'}; 或者更簡單的方式char[] vowels = {'a','e','i','o','u'}; 可以使用for迴圈來遍歷一個數組中的所有元素,同時,由於陣列總是實現了IEnumerable<T>,所以也能夠使用foreach來列舉陣列成員:
1 char[] vowels = {'a','e','i','o','u'}; 2 3 for (int i = 0; i < vowels.Length; i++) 4 { 5 Console.Write (vowels[i]); 6 } 7 8 foreach (char c in vowels) 9 { 10 Console.Write (c); 11 }
48.建立一個數組總是會使用預設值來預初始化每個元素,一個型別的預設值就是在記憶體中每一位都是0,對於值型別來說,就是0,對於引用型別來說,就是null。無論元素型別是什麼,陣列自身總是引用型別的。
49.多維陣列有兩種形式:矩形陣列(Rectangular arrays)和不規則陣列(Jagged arrays)。矩形陣列宣告時使用逗號來分割每一維,如int[,] matrix = new int [3, 3]; 一個矩形陣列可以像下面這樣初始化:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int [,]
matrix = new
int [,]
{
{0,1,2},
{3,4,5},
{6,7,8}
};
//
更簡潔的方式
int [,]
matrix =
{
{0,1,2},
{3,4,5},
{6,7,8}
};
|
不規則陣列使用連續的方括號來代表每一維,如宣告一個2維陣列,最外維的大小為3:int[][] matrix = new int[3][]; 可以發現,宣告時並沒有指定內維的大小,與矩形陣列不同的是,每個內維陣列可以使任意大小的。因為內維陣列被隱式初始化為null而不是一個空陣列,所以內維陣列必須手動建立:
?