1. 程式人生 > >【Unity】面試題整理

【Unity】面試題整理

第一部分
1. 請簡述值型別與引用型別的區別
1.值型別儲存在記憶體棧中,引用型別資料儲存在記憶體堆中,實際存放的是記憶體堆中物件的地址。
2.值型別存取快,引用型別存取慢。
3.值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用。
4.棧的記憶體是自動釋放的,堆記憶體是.NET中會由GC來自動釋放。
5.值型別繼承自System.ValueType(它的父類是System.Object),引用型別繼承自System.Object。

2.C#中所有引用型別的基類是什麼
引用型別的基類是System.Object 值型別的基類是System.ValueType
同時,值型別也隱式繼承自System.Object

3.請簡述ArrayList和List的主要區別
ArrayList存在不安全型別(ArrayList會把所有插入其中的資料都當做Object來處理)
裝箱拆箱的操作(費時)
IList是介面,AIrrayList和List都是實現了該介面的類,可以被例項化。

4.請簡述GC(垃圾回收)產生的原因,並描述如何避免?
GC回收堆上的記憶體
避免:
1)減少new產生物件的次數
2)使用公用的物件(靜態成員),但是靜態物件會一直存在,直到退出程式
3)將String換為StringBuilder

5.請描述Interface與抽象類之間的不同
介面中所有的方法都不能有實現,並且不能指定方法的修飾符
    抽象類中可以有方法的實現,也可以指定方法的訪問修飾符
    第一個繼承介面的類必須實現接口裡的所有方法
    而抽象類中抽象方法的實現是由第一個非抽象的派生類來實現的
也就是說,如果抽象類的子類還是派生類那麼是可以不實現父類中的抽象方法的

6.下列程式碼在執行中會產生幾個臨時物件?

首先,第1行程式碼的建構函式在C#程式中會出現錯誤,因為沒有字串型別的建構函式過載,所以嚴格的說可以說無法建立物件,但是出題者顯然是忽略掉了這個問題,因為在Java中是可以建立的,所以回答的時候可以說明情況再進行作答。如果是在Java中,第1行會產生2個物件,分別是a和“abc”,第2行中會產生另外一個新的物件,所以一共會產生3個物件。

7.下列程式碼在執行中會發生什麼問題?如何避免?

會產生執行時的錯誤,因為foreach是隻讀的,不能修改被遍歷的物件中的資料

8.請簡述關鍵字Sealed用在類宣告和函式宣告時的作用
修飾類時可防止其他類繼承此類
修飾方法時則可防止派生類重寫此方法

9.請簡述private,public,protected,internal的區別
public:對任何類和成員都公開,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程式集中訪問該類
protected internal:protected + internal,表示當前程式集或者其子類可以訪問。注意是 protected 和 internal 是或者的關係。

10.反射的實現原理?
反射是審查元資料並收集關於它的型別資訊的能力
1.using System.Reflection;
2.Assembly.Load(“程式集”)載入程式集,返回型別是一個Assembly
3. foreach (Type type in assembly.GetTypes())
            {
                string t = type.Name;
            }
   得到程式集中所有類的名稱

  1. .Net與Mono的關係?
    Mono是.Net的一個開源跨平臺工具,就類似java虛擬機器,java本身不是跨平臺語言,但執行在虛擬機器上就能夠實現了跨平臺。.Net只能在windows下執行,Mono可以實現跨平臺跑,
    可以運行於Linux,Unix,Mac OS等。

12.簡述unity3d支援的作為指令碼的語言的名稱
Unity的指令碼語言基於Mono的.Net平臺上執行,可以使用.NET庫,這也為XML、資料庫、正則表示式等問題提供了很好的解決方案。
Unity裡的指令碼都會經過編譯,他們的執行速度也很快。這三種語言實際上的功能和執行速度是一樣的,區別主要體現在語言特性上。
(語言1)C#:官方曾經統計C#語言的使用率在80%以上,Boo語言的使用只用0.4%,也是被取消的原因之一
(語言2)JavaScript:和網頁中常用的JavaScript不一樣,它編譯後的執行速度很快,語法方面也會有不少區別。
(語言3)Boo(Unity5.0的時候取消了對該語言的支援):可以看做是Python語言的變種,又糅合了Ruby和C#的特性,它是靜態型別語言

13.Unity3D是否支援寫成多執行緒程式?如果支援的話需要注意什麼?
僅能從主執行緒中訪問Unity3D的元件,物件和Unity3D系統呼叫
支援:如果同時你要處理很多事情或者與Unity的物件互動小可以用thread(C#中的,不屬於Unity),否則使用協同程式。
注意:C#中有lock這個關鍵字,以確保只有一個執行緒可以在特定時間內訪問特定的物件

14.Unity3D的協程和C#執行緒之間的區別是什麼?
多執行緒程式同時執行多個執行緒 ,而在任一指定時刻只有一個協程在執行,並且這個正在執行的協同程式只在必要時才被掛起。除主執行緒之外的執行緒無法訪問Unity3D的物件、元件、方法。
Unity3d沒有多執行緒的概念,不過unity也給我們提供了StartCoroutine(協同程式)和LoadLevelAsync(非同步載入關卡)後臺載入場景的方法。 StartCoroutine為什麼叫協同程式呢,所謂協同,就是當你在StartCoroutine的函式體裡處理一段程式碼時,利用yield語句等待執行結果,這期間不影響主程式的繼續執行,可以協同工作。而LoadLevelAsync則允許你在後臺載入新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家遊戲未卡死,同時後臺協同處理載入的事宜 Asynchronous同步。 

15.U3D中用於記錄節點空間幾何資訊的元件名稱,及其父類名稱
元件是Transform ,它的父類是 Component

16.簡述四元數的作用,四元數對尤拉角的優點?
四元數用於表示旋轉
相對尤拉角的優點:
1)能進行增量旋轉
2)避免萬向鎖
3)給定方位的表達方式有兩種,互為負(尤拉角有無數種表達方式)

17.向量的點乘、叉乘以及歸一化的意義?
點乘(Dot Product)
      如果說加法是憑直覺就可以知道的,另外還有一些運算就不是那麼明顯的,比如點乘和叉乘。
      點乘比較簡單,是相應元素的乘積的和:
      V1( x1, y1)   V2(x2, y2) = x1*x2 + y1*y2
      注意結果不是一個向量,而是一個標量(Scalar)。點乘有什麼用呢,我們有:
      A   B = |A||B|Cos(θ)
      θ是向量A和向量B見的夾角。這裡|A|我們稱為向量A的模(norm),也就是A的長度, 在二維空間中就是|A| = sqrt(x2+y2)。這樣我們就和容易計算兩條線的夾角:    Cos(θ) = AB /(|A||B|)
      當然你知道要用一下反餘弦函式acos()啦。(回憶一下cos(90)=0 和cos(0) = 1還是有好處的,希望你沒有忘記。)這可以告訴我們如果點乘的結果,簡稱點積,為0的話就表示這兩個向量垂直。當兩向量平行時,點積有最大值
      另外,點乘運算不僅限於2維空間,他可以推廣到任意維空間。(譯註:不少人對量子力學中的高維空間無法理解,其實如果你不要試圖在視覺上想象高維空間,而僅僅把它看成三維空間在數學上的推廣,那麼就好理解了)
叉乘(cross product)
      相對於點乘,叉乘可能更有用吧。2維空間中的叉乘是:
      V1(x1, y1) X V2(x2, y2) = x1y2 – y1x2
      看起來像個標量,事實上叉乘的結果是個向量,方向在z軸上。上述結果是它的模。在二維空間裡,讓我們暫時忽略它的方向,將結果看成一個向量,那麼這個結果類似於上述的點積,我們有:
    A x B = |A||B|Sin(θ)

      然而角度 θ和上面點乘的角度有一點點不同,他是有正負的,是指從A到B的角度。因此 ,向量的外積不遵守乘法交換率,因為向量a×向量b=-向量b×向量a在物理學中,已知力與力臂求外積,就是向量的外積,即叉乘。
      向量c的方向與a,b所在的平面垂直,且方向要用“右手法則”判斷。判斷方法如下:
1.右手手掌張開,四指併攏,大拇指垂直於四指指向的方向;
2.伸出右手,四指彎曲,四指與A旋轉到B方向一致,那麼大拇指指向為C向量的方向。

另外還有一個有用的特徵那就是叉積的絕對值就是A和B為兩邊說形成的平行四邊形的面積。也就是AB所包圍三角形面積的兩倍。在計算面積時,我們要經常用到叉積

標準化向量:用在只關係方向,不關心大小的時候,標準化向量不改變向量的方向,只是將向量的大小變為1

18.矩陣相乘的意義及注意點
用於表示線性變換:旋轉、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累

19.為何大家都在移動裝置上尋求U3D原生GUI的替代方案
OnGUI很耗費時間(每幀呼叫2次,頻率是Update的2倍),使用不方便 ,DrawCall更高

20.請簡述如何在不同解析度下保持UI的一致性
NGUI很好的解決了這一點,螢幕解析度的自適應性,原理就是計算出螢幕的寬高比跟原來的預設的螢幕解析度求出一個對比值,然後修改攝像機的size。
UGUI中,CanvansScaler中的UI Scale Mode可以選擇支援UI的適配方式

21.為什麼dynamic font在unicode環境下優於static font
Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。
使用動態字型時,Unity將不會預先生成一個與所有字型的字元紋理。 當需要支援亞洲語言或者較大的字型的時候,若使用正常紋理,則字型的紋理將非常大。

22.Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同
Mesh 就是指模型的網格(同名元件是用於調整網格屬性的), MeshFilter 一般是用於獲得模型網格的元件,而 MeshRender 是用於把網格渲染出來的元件。
SkinnedMeshRender:蒙皮網格用於渲染人物, 當匯入有蒙皮的網格時,骨骼蒙皮渲染器會自動新增到匯入的網格。

24.在場景中放置多個Camera並同時處於活動狀態會發生什麼?
實際看到的畫面由多個camera的畫面組成,由depth、Clear Flag、Culling Mask都會影響最終合成效果。

25.Prefab的作用?如何在移動環境的裝置下恰當地使用它?
在遊戲執行時例項化,prefab相當於一個模版,對你已有的素材、指令碼、引數做一個預設配置,以便於以後修改,同時prefab打包的內容簡化了匯出的操作,便於團隊的交流。

26.如何銷燬一個UnityEngine.Object及其子類
Destory(自身遊戲物件); 會銷燬自身及其所有的子物體

27.為什麼Unity3D中會發生在元件上出現數據丟失的情況?
元件上繫結的物件被刪除了,如果UI元件作為預製體並且添加了監聽事件,那麼生成之後,監聽事件會消失

28.如何安全的在不同工程間安全地遷移asset資料?三種方法
1.將Assets目錄和Library目錄一起遷移
2.匯出包
3.用unity自帶的assets Server功能

29.MeshCollider和其他Collider的一個主要不同點?
Meshcollider是基於Vector3頂點, collider本身是基於演算法,沒有面的概念

30.當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
穿透(碰撞檢測失敗)
解決方法:
1. 增大細小物體的碰撞體
2. 使用射線檢測
3. 可以physics time減小,不建議這樣做
4. 確保rigidbody不超過一定的速度,這個也不實用
31.OnEnable、Awake、Start執行時的發生順序?哪些可能在同一個物件週期中反覆的發生?
Awake —>OnEnable—>Start
OnEnable在同一週期中可以反覆地發生

32.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回撥函式的意義?
當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。 但是在編輯器狀態下,Scene檢視中攝像機是否能看到遊戲物件,也會觸發這兩個回撥函式

33.Unity3D 中動態載入資源有幾種方法,分別是什麼?

 通過Resources模組,呼叫它的load函式:可以直接load並返回某個型別的Object,前提是要把這個資源放在Resource命名的資料夾下,Unity不關有沒有場景引用,都會將其全部打入到安裝包中。
 通過bundle的形式:即將資源打成 asset bundle 放在伺服器或本地磁碟,然後使用WWW模組get 下來,然後從這個bundle中load某個object。
 通過AssetDatabase.loadasset :這種方式只在editor範圍內有效,遊戲執行時沒有這個函式,它通常是在開發中除錯用的

34.MeshRender中material和sharedmaterial的區別?
修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程裡的材質設定。
不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。

第二部分
1. 請描述遊戲動畫有哪幾種,以及其原理。
主要有關節動畫、單一網格模型動畫(關鍵幀動畫)、骨骼動畫。
關節動畫把角色分成若干獨立部分,一個部分對應一個網格模型,部分的動畫連線成一個整體的動畫,角色比較靈活Quake2中使用了這種動畫。
單一網路模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀裡記錄各個頂點的原位置及其改變數,然後插值運算實現動畫效果,角色動畫較真實。
骨骼動畫,廣泛應用的動畫方式,集成了以上兩個方式的優點,骨骼按角色特點組成一定的層次結構,由關節相連,可做相對運動,面板作為單一網格蒙在骨骼之外,決定角色的外觀。面板網格每一個頂點都會受到骨骼的影響,從而實現完美的動畫。(骨骼動畫是由關節動畫發展而來的,如今基本都使用骨骼動畫來實現角色動畫)

  1. alpha blend 工作原理
    實際顯示顏色 = 前景顏色Alpha/255 + 背景顏色(255-Alpha)/255

  2. 寫光照計算中的diffuse的計算公式(頻率較低)
    實際光照強度 I= 環境光(Iambient) + 漫反射光(Idiffuse) + 鏡面高光(Ispecular);
    環境光:Iambient= Aintensity* Acolor; (Aintensity表示環境光強度,Acolor表示環境光顏色)
    漫反射光:Idiffuse = Dintensity*Dcolor*N.L;
    (Dintensity表示漫反射強度,Dcolor表示漫反射光顏色,N為該點的法向量,L為光源向量)
    鏡面反射光:Ispecular = Sintensity*Scolor*(R.V)^n;
    (Sintensity表示鏡面光照強度,Scolor表示鏡面光顏色,R為光的反射向量,V為觀察者向量,n稱為鏡面光指數)

  3. lod是什麼,優缺點是什麼
    LOD技術即Levels of Detail的簡稱,意為多細節層次。LOD技術指根據物體模型的節點在顯示環境中所處的位置和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
    優點:可根據距離動態地選擇渲染不同細節的模型
    缺點:加重美工的負擔,要準備不同細節的同一模型,同樣的會稍微增加遊戲的容量。

  4. 兩種陰影判斷的方法工作原理(面試題出現過,幾乎沒人問)
    陰影由兩部分組成:本影與半影
    本影:景物表面上那些沒有被光源直接照射的區域(全黑的輪廓分明的區域)
    半影:景物表面上那些被某些特定光源直接照射但並非被所有特定光源直接照射的區域(半明半暗區域)
    求陰影區域的方法:做兩次消隱過程
    一次對每個光源進行消隱,求出對於光源而言不可見的區域L;
    一次對視點的位置進行消隱,求出對於視點而言可見的面S;
    shadow area= L ∩ S
    陰影分為兩種:自身陰影和投射陰影
    自身陰影:因物體自身的遮擋而使光線照射不到它上面的某些可見面
    工作原理:利用背面剔除的方法求出,即假設視點在點光源的位置。
    投射陰影:因不透明物體遮擋光線使得場景中位於該物體後面的物體或區域受不到光照照射而形成的陰影
    工作原理:從光源處向物體的所有可見面投射光線,將這些面投影到場景中得到投影面,再將這些投影面與場景中的其他平面求交得出陰影多邊形,儲存這些陰影多邊形資訊,然後再按視點位置對場景進行相應處理得到所要求的檢視(利用空間換時間,每次只需依據視點位置進行一次陰影計算即可,省去了一次消隱過程)
    若是動態光源此方法就無效了。

5.Vertex Shader是什麼?怎麼計算?
頂點著色器是一段執行在GPU上的程式,用來取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作頂點。
Vertex Shader對輸入頂點完成了從local space到homogeneous space(齊次空間)的變換過程,homogeneous space即projection space的下一個space。在這其間共有world transformation, view transformation和projection transformation及lighting幾個過程。

  1. MipMap是什麼?作用?
    在三維計算機圖形的貼圖渲染中有一個常用的技術被稱為Mipmapping。為了加快渲染速度和減少影象鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的檔案,這樣的貼圖被稱為 MIP map 或者 mipmap。

  2. 用u3d實現2d遊戲,有幾種方式?
     1.利用引擎自帶的GUI
      2.把攝像機設為Orthographic,用面片作為2d元素
      3.利用第三方外掛:NGUI、2dToolkit

  3. u3d中碰撞器和觸發器的區別?
    collider碰撞器會有碰撞的效果,IsTrigger = false,可以呼叫OnCollisionEnter/Stay/Exit函式
    trigger觸發器沒有碰撞效果,isTrigger = true,可以呼叫OnTriggerEnter/stay/exit函式

  4. 物體發生碰撞的必要條件
    兩個物體都有碰撞器,運動的物體必須帶有剛體

  5. CharacterController(第一人稱控制器)和Rigidbody的區別
    Rigidbody具有完全真實物理的特性,而CharacterController可以說是受限的Rigidbody,具有一定的物理效果但不是完全真實的。

  6. 物體發生碰撞時,有幾個階段,分別對應的函式
    三個階段,OnCollisionEnter/Stay/Exit函式

  7. u3d中,幾種施加力的方式,描述出來。
    rigidbody.AddForce/AddForceAtPosition,都是rigidbody的成員函式

  8. 什麼叫做鏈條關節
    Hinge Joint ,他可以模擬兩個物體間用一根鏈條連線在一起的情況,能保持兩個物體在一個固定距離內部相互移動而不產生作用力,但是達到固定距離後就會產生拉力。(簡單說就是彈簧)

  9. 物體自旋轉使用的函式叫什麼
       transform.Rotate

  10. 物體繞某點旋轉使用函式叫什麼
    transform.RotateAround

  11. u3d提供了一個用於儲存讀取資料的類,(playerPrefs),請列出儲存讀取整形資料的函式
    PlayerPrefs.SetInt 與 PlayerPrefs.GetInt

  12. unity3d提供了幾種光源,分別是什麼
    平行光:Directional Light
    聚光燈:Spot Light
    點光源:Point Light
    區域光源:Area Light(只用於烘培)

  13. unity3d從喚醒到銷燬有一段生命週期,請列出系統自己呼叫的幾個重要方法。
    Awake –>OnEnable –> Start  –> FixedUpdate –>Update –>LateUpdate –> OnGUI –>OnDisable –> OnDestroy

  14. 物理更新一般在哪個系統函式裡?
    FixedUpdate,每固定幀繪製時執行一次,和update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate呼叫次數就會跟著下降。FixedUpdate比較適用於物理引擎的計算,因為是跟每幀渲染有關。Update就比較適合做控制。

  15. 移動相機動作在哪個函式裡,為什麼在這個函式裡。
    LateUpdate,,是在所有update結束後才調,比較適合用於命令指令碼的執行。官網上例子是攝像機的跟隨,都是在所有update操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角里還未有角色的空幀出現。

  16. 當遊戲中需要頻繁建立一個物體物件時,我們需要怎麼做來節省記憶體。
    做一個物件池,遊戲開始時預先例項化足夠的數量,然後用的時候取不用的時候收回

  17. 一個場景放置多個camera並同時處於活動狀態,會發生什麼
    實際看到的畫面由多個camera的畫面組成,由depth、Clear Flag、Culling Mask都會影響最終合成效果。 
    第三部分
    1. 什麼是渲染管道?
    是指在顯示器上為了顯示出影象而經過的一系列必要操作。 渲染管道中的很多步驟,都要將幾何物體從一個座標系中變換到另一個座標系中去。
    主要步驟有:
    本地座標->檢視座標->背面裁剪->光照->裁剪->投影->檢視變換->光柵化。

2. 如何優化記憶體?
有很多種方式,例如
1.壓縮自帶類庫;
2.將暫時不用的以後還需要使用的物體隱藏起來而不是直接Destroy掉;
3.釋放AssetBundle佔用的資源;
4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;
5.使用光照貼圖,使用多層次細節(LOD),使用著色器(Shader),使用預設(Prefab)。

3、什麼是協同程式?
Unity用來模擬多執行緒的手段,在主執行緒執行時同時開啟另一段邏輯處理,來協助當前程式的執行。換句話說,開啟協程就是開啟一個“執行緒”。可以用來控制運動、序列以及物件的行為。

4、你用過哪些外掛?
  NGUI、EasyTouch & EasyJoystick、FX Maker、Playmaker
DoTween、UnIDE 、Tile Based Map and Nav、Toon shader

第四部分
1. 反向旋轉動畫的方法是什麼?
反轉動畫,將動畫的速度調到-1,改變animation.speed

  1. 實現吊機吊物體的功能
    用程式碼實現,吊車吊物體的情景,提示使用碰撞或觸發事件

3.獲取、增加、刪除元件的命令分別是什麼?
獲取:GetComponent
增加:AddComponent
刪除:Destroy

4.Animation.CrossFade命令作用是
動畫的淡入為其他動畫

5.除錯記錄到控制檯的命令是什麼?
Debug.Log();

6.編輯器類存放路徑是什麼?
工程目錄下的Assets/Editor資料夾下。

7.使用原生GUI建立一個可以拖動的視窗命令是什麼?
 GUI.DragWindow();

8.localPosition與Position的使用區別?
localPosition:自身位置,相對於父級的變換的位置。 
Position:在世界座標transform的位置
9.寫一個計時器工具,從整點開始計時,格式為:00:00:00
using UnityEngine;
using System.Collections;
public class MyTime : MonoBehaviour
{
    private float timer = 0f;
    private int h = 0;
    private int m = 0;
    private int s = 0;
    private string timeStr = string.Empty;
  
    void Update ()
    {
        timer += Time.deltaTime;
        if (timer >= 1f) {
            s++;
            timer = 0;
        }
        if (s >= 60) {
            m++;
            s = 0;
        }
        if (m >= 60) {
            h++;
            m = 0;
        }
        if (h >= 99) {
            h = 0;
        }
    }

    void OnGUI ()
    {
        timeStr = string.Format (“{0:D2}:{1:D2}:{2:D2}”, h, m, s);
        GUI.Label (new Rect (10, 10, 100, 200), timeStr);
    }

}
10.寫出Animation的五個方法
Animation.Play
Animation.CrossFade
Animation.Stop
Animation.Sample
Animation.AddClip

11.怎麼拿到一個物件上指令碼的方法
GameObject.GetComponent();

第五部分
1.在類的建構函式前加上static會報什麼錯?為什麼?
建構函式格式為 public+類名如果加上static會報錯(靜態建構函式不能有訪問修飾符)
原因:靜態建構函式不允許訪問修飾符,也不接受任何引數; 
無論建立多少型別的物件,靜態建構函式只執行一次; 
執行庫建立類例項或者首次訪問靜態成員之前,執行庫呼叫靜態建構函式; 
靜態建構函式執行先於任何例項級別的建構函式; 
顯然也就無法使用this和base來呼叫建構函式。

  1. C# String型別比stringBuilder型別的優勢是什麼?
    如果是處理字串的話,用string中的方法每次都需要建立一個新的字串物件並且分配新的記憶體地址,而stringBuilder是在原來的記憶體裡對字串進行修改,所以在字串處理方面還是建議用stringBuilder這樣比較節約記憶體。但是string 類的方法和功能仍然還是比stringBuilder類要強。
    string類由於具有不可變性(即對一個string物件進行任何更改時,其實都是建立另外一個string類的物件),所以當需要頻繁的對一個string類物件進行更改的時候,建議使用StringBuilder類,StringBuilder類的原理是首先在記憶體中開闢一定大小的記憶體空間,當對此StringBuilder類物件進行更改時,如果記憶體空間大小不夠,會對此記憶體空間進行擴充,而不是重新建立一個物件,這樣如果對一個字串物件進行頻繁操作的時候,不會造成過多的記憶體浪費,其實本質上並沒有很大區別,都是用來儲存和操作字串的,唯一的區別就在於效能上。
    String主要用於公共API,通用性好、用途廣泛、讀取效能高、佔用記憶體小。
    StringBuilder主要用於拼接String,修改效能好。
    不過現在的編譯器已經把 String 的 + 操作優化成 StringBuilder 了,所以一般用String就可以了
    String是不可變的,所以天然執行緒同步。
    StringBuilder可變,非執行緒同步。

3.C# 函式Func(string a, string b)用Lambda表示式怎麼寫?
public delegate string Del (string a);
Del del = (string a) => {
            return “返回值為字串b”;
   };

4.數列1,1,2,3,5,8,13…第n位數是多少?用C#遞迴演算法實現
public  int  recursion (int n)
    {
        if (n == 0) {
            return 0;
        } 
        if (n == 1 || n == 2) {
            return 1;
        }

        return recursion (n - 1) + recursion (n - 2);    
    }

5.<憤怒的小鳥>給予初速度以後,怎麼讓小鳥受到重力和空氣阻力的影響而繪製拋物線軌跡,說出具體的計算方法.
 Vector3 v代表初速度v’代表現在的速度,假設小鳥是沿的z軸也就是transform.forward方向運動的質量為1,那麼v‘=v-new Vector3(0,g*t,f*t),transform.Translate(v’)做的就是拋物線運動(g為重力加速度不要用現實中的需要自己除錯,f為阻力也要自己除錯設定,t為時間)
 

第六部分
1.C#中類是否支援多繼承?請說明原因。
答:不支援,需要用介面來實現多繼承

2.我們都知道一個類可以有多個建構函式,並且C#會在我們建立類的時候預設的提供一個無參的建構函式,當我實現了另外一個有引數的建構函式的時候,我還能呼叫無引數的建構函式嗎?請說明原因。
答:不能,因為一旦你實現了一個建構函式,C#就不會再提供預設的構造函 數了,所以需要自己手動寫入一個無引數的建構函式。

3.請簡略描述過載和重寫的區別?
答:方法過載提供了一個相同的方法但是方法簽名的引數不同的呼叫的實現。
      重寫提供了子類中改變父類方法行為的實現。

4.請問能設定類A可被繼承,但類A中的某個方法不能被重寫嗎?
答:能,將類A的修飾符標記為public、標記類A中的不允許重寫的方法為sealed
sealed關鍵字不僅可以限制類,也可以限制方法。

5.const和readonly有什麼區別?
答:const關鍵字用來宣告編譯時的常量
      readonly用來宣告執行時的常量

6.什麼時候必須宣告一個類為抽象類?
答:(1)當這個類中有抽象方法的時候,必須宣告類為抽象類
       (2)該類沒有完全實現父類的抽象方法時,也需要宣告為抽象類

7.介面和抽象類的區別是什麼?
答:介面中所有的方法都不能有實現,並且不能指定方法的修飾符
    抽象類中可以有方法的實現,也可以指定方法的訪問修飾符
    第一個繼承介面的類必須實現接口裡的所有方法
    而抽象類中抽象方法的實現是由第一個非抽象的派生類來實現

8.類的私有成員會被子類繼承嗎?請說明原因。
答:會被子類繼承,但是不能被訪問。所以看上去是不能被繼承的,實際上確實被繼承了。

9.請寫出C#中的單例模式
    答:
  public class Single
    {
        private static Single instance;
        private Single (){}
        public static Single GetInstance ()
        {
            if (instance == null) {
                instance = new Single ();
            }
            return instance;
        }
    }

10.現有一個整數number,請寫一個方法判斷這個整數是否是2的N次方
答:
private static bool GetFlag(int num)
        {
        if (num < 1) return false;
        return (num & num - 1) == 0;
     }