Unity3D學習之路 - C#學習筆記(一)


 

最近開始學習Unity開發,由於以前一直都是從事C/C++開發,所以對於Unity的腳本語言方面,選擇了最相近的C#。由於從頭開始學習C#是沒有必要的,所以就惡補了一下必須的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而不是一個空數組,所以內維數組必須手動創建:

?
1
2
3
4
5
6
7
int [][] matrix = new int [3][];
for ( int i = 0; i < matrix.Length; i++)
{
   matrix[i] = new int [3];       // 創建內維數組
   for ( int j = 0; j < matrix[i].Length; j++)
     matrix[i][j] = i * 3 + j;
}

不規則數組可以像下面這樣初始化:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int [][] matrix = new int [][]
{
   new int [] {0,1,2},
   new int [] {3,4,5},
   new int [] {6,7,8}
};
  
// 更簡潔的方式
int [][] matrix =
{
   new int [] {0,1,2},
   new int [] {3,4,5},
   new int [] {6,7,8}
};

50.還有另一個簡潔的數組初始化表達式,它省略了new關鍵字之后的類型名,讓編譯器去推斷數組類型。當傳遞數組類型的參數時,這是一個十分有用的縮寫:

?
1
2
void Foo ( char [] data) { ... }
Foo ( new []{ 'a' , 'e' , 'i' , 'o' , 'u' } );


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM