1. 程式人生 > >當優美的C#與Unity3D結合時開發遊戲變的超Esey(一)必須掌握的C#100個基本點。

當優美的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而不是一個空陣列,所以內維陣列必須手動建立:

?

相關推薦

優美C#Unity3D結合開發遊戲Esey必須掌握C#100基本點

Unity3D提供支援三種指令碼語言,但是Jscript並非一我們所熟知的那個Jscript,有著很大的不同,所以建議使用優美的C#語言來寫指令碼,下面是必須掌握的100個C#基本點。 1.C#中使用//(雙斜槓)來表明本行的剩餘部分代表註釋。 2.C#中

Qt5.9.1結合REF開發基於chorm的瀏覽器

編譯 ++ mar 建立 eat generate sha 設計 source 下載cef3的源碼 cef簡介   嵌入式Chromium框架(簡稱CEF) 是一個由Marshall Greenblatt在2008建立的開源項目,它主要目的是開發一個基於Google Chr

C++之複製物件勿忘每一個成分12---《Effective C++》

條款12:賦值物件時勿忘其每一個成分 C++中設計良好的物件系統會將物件的內部封裝起來,只留下兩個函式負責物件那個拷貝(賦值),即copy建構函式和copy operator=。 如果我們自己宣告自己的copying函式,則C++的編譯器則不會對我們自己提供

C++ STL開發溫習總結: 1.C++程式設計技術

 C++ STL開發溫習與總結(一):1.C++程式設計技術       使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術點。 1概論 l  C++語言是基於C語言的語法基礎上融入了其他語

Qt5.9.1結合REF開發基於chorm的瀏覽器

aid imp right put 作用 配置 lis res window 將libcef_dll_wrapper編譯方式設置為MD 因為使用的Qt是動態鏈接的,而cef模式使用的是靜態鏈接的方式,所以在使用前需要將cef編譯方式改成Multi-thread DLL(/

C# 分片斷點續傳到七牛雲伺服器----開發過程參考檔案

前段時間做了一個專案:在WPF上,實現檔案上傳到七牛雲伺服器和從伺服器中檔案下載的功能; 下面分享開發的主要步驟: C# 分片斷點續傳到七牛雲伺服器(一) 開發過程參考 1、七牛雲開發者中心:https://developer.qiniu.com/   &n

基於c++的網路開發庫boost.Asio學習 Ubuntu安裝boost以及問題解決

執行環境:Ubuntu 12.04   版本: boost 1.68 下載網址:http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.bz2/download

Visual C++ 遊戲開發筆記 紋理對映技術

一、引言 江山如此多嬌,風景如畫。萬物都有其獨特的特點。真實世界中的物體,在計算機三維世界中如果單單用各種各樣的幾何體以及頂點座標,頂點顏色來模擬的話,往往缺乏生機,往往差強人意。 比如說我們要繪製出如下效果的一個貼了瓷磚的立方體: 綜合我們之前講過的知識,繪製一個立方體是小菜一

JNI開發 簡單的C程式碼打包成SO庫以及專案如何呼叫SO庫

前段時間開發過程中用到了簡單的JNI使用,當時發現很多網上文章總有這樣那樣的問題,最近趁時間充裕就記錄下來,以供記憶和交流。 JNI環境配置 這裡就不做多講,百度一下,把腳跨過牆就好。 寫

iOS開發——圖形程式設計OC篇&CALayer介紹基本使用

在iOS中,你能看得見摸得著的東西基本上都是UIView,比如一個按鈕、一個文字標籤、一個文字輸入框、一個圖示等等,這些都是UIView。 其實UIView之所以能顯示在螢幕上,完全是因為它內部的一個圖層,在建立UIView物件時,UIView內部會自動建立一個圖層(即CALayer物件),通過UIVi

Qt5.9.1結合CEF開發基於chorm的瀏覽器

將libcef_dll_wrapper編譯方式設定為MD因為使用的Qt是動態連結的,而cef模式使用的是靜態連結的方式,所以在使用前需要將cef編譯方式改成Multi-thread DLL(/MD),修改路徑在在C/C++->Code Generation下的Runtime Library。重新編譯後的

c++後臺開發面試常見知識點總結c++基礎

指標和引用的區別 extern,const,static,volatile關鍵字 #define 和const的區別 關於typedef和#define; C++程式中記憶體使用情況分析(堆和棧的區別) new 與 malloc的異同處,new和delete是如何實現的。 C和C++的區別 C++中的過載,

Unity3d StreamingAssets資源復制到沙盒

資源copy 沙盒 由於項目已實現熱更新,所以資源優先由沙盒讀取,或完全直接從沙盒讀取。為了防止在更新大版本時使用到舊項目的資源,所以需要對沙盒中舊的資源進行覆蓋。暫時實現了以下兩種copy方案。MD5文件格式與生成:方法一:將本地資源一次性全部copy到沙盒,僅在首次安裝或覆蓋安裝時對比oldfiles進

C#.Net 設計模式學習筆記之創建型

應用 種類 單件 src nag abstract 子類 指定 相關 1、抽象工廠(Abstract Factory)模式 常規的對象創建方法: //創建一個Road對象 Road road =new Road(); new 的問題: 實現依賴,不能應對“具

Kotlin開發基礎從0開始

code ... 多說 lang 學習 function ria lis lac 為什麽學習kotlin kotlin在今年的Google IO 上正式被確認為Android的官方開發語言,想必原因大家也能猜到一二,一是Google與oracle關於Java相關的版權相關的

尋找bug並消滅系列——記錄在Android開發所遇到的bug

ont 屬性 XML android oid content 事件監聽器 監聽 設置 之前使用了Android Studio的插件直接為button綁定了監聽器,並實現onClick方法(我的onClick方法無論點擊哪一個都是要實現setcontentview這個方法設置

C#高級編程第9版 閱讀筆記

mda 查找 弱引用 isp protect enume 前言 不支持 操作符 一、前言 C# 簡潔、類型安全的面向對象的語言。 .NET是一種在windows平臺上編程的架構——一種API。 C#是一種從頭開始設計的用於.NET的語言,他可以

C語言:初始C語言

實踐 概念 個數 部分 貝爾 指令集 觸摸 物理學 解釋器   學習筆記:    C的歷史和特性 編寫程序的步驟 編譯器和鏈接器的一些知識 C的標準    1.1 C語言

C#可擴展編程之MEF學習筆記:MEF簡介及簡單的Demo

com ring this exec hosting code .cn 引用 展開 在文章開始之前,首先簡單介紹一下什麽是MEF,MEF,全稱Managed Extensibility Framework(托管可擴展框架)。單從名字我們不難發現:MEF是專門致力於解決擴展性

全棧開發之HTML快速入門

ack enter 提示 其他 red tle 顯示圖片 val password 一、HTML 是什麽? HTML 指的是超文本標記語言 (Hyper Text Markup Language) HTML 不是一種編程語言,而是一種標記語言 (markup lan