今天咱們就要說兩個東西:委託與值/引用類型。數組
1委託。函數
由於在unity中咱們仍是用的不多,因此這個委託我就一直不是很明白,因此今天就來講說這個委託究竟是什麼東西。我其實在unity中用的形式通常是這個樣子的。this
btn.OnClick.AddListener(()=>{Debug.Log("Hello World")});這個形式是一個Lambda形式,可是在實際事情下仍是用的不多,Unity有一點仍是很差的,將大部分功能都封裝給一個類,咱們只須要調用API就好了,可是咱們並不知道他們的原理是什麼,因此咱們知道原理比這裏調用API要重要的多。好了,如今在來講說委託究竟是什麼?委託就是一個引用,就是C語言中的指針。咱們但願並非直接調用這個方法的時候,咱們就須要是使用委託,委託也就是間接調用方法,這個委託在使用回調函數的時候用的不少,那咱們先來複習一下回調函數吧。A--->B,B運行程序的時候會調用A,A就是回調函數。也就是咱們能夠把委託看成一個回調函數,由於第一個執行的函數永遠不會是A,--->這個箭頭也是具備誤導人的做用的,並非A調用B,而是將A給B ,再由B來調用A。spa
如今在來講說委託中的兩個使人蛋疼的名詞--委託類型與委託實例。其實咱們如今來看的話,也是沒有社麼難度的,一個類型一個實例簡直是簡單的不要不要的,可是老是有人把它們兩個看成委託,其實不是這個樣子的,delegate void GetString(string str);委託類型其實就是定義參數類型的列表與一個返回類型。這裏面的string str,並非一個參數(咱們映像中的參數好像就是一個數字或者是什麼的),你能夠把這個參數看成一個函數,這樣來講明的話會更加明白點。下面的委託實例的話,會更加明白了,面向對象就是建立實例,委託也是不例外的。一句話來講明委託就是調用方法,因此你必須給我一個方法。線程
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //委託 namespace CSharp1所搭建的核心基礎 { delegate void StringProcessor(string input);//聲明委託的類型 class Person//聲明兼容的實例方法 { string name; public Person(string name) { this.name = name; } public void Say(string message) { Console.WriteLine("{0} says :{1}", name, message); } } class Background//聲明兼容的靜態方法 { public static void Note(string note) { Console.WriteLine("({0})", note); } } class SimpleDelegateUse { static void Main() { Person jon = new Person("Jon"); Person tom = new Person("Tom"); StringProcessor jonsVoice, tomsVoice, backGround;//建立3個實例方法 jonsVoice = new StringProcessor(jon.Say); tomsVoice = new StringProcessor(tom.Say); backGround = new StringProcessor(Background.Note); jonsVoice("Hello Son.");//調用委託方法 tomsVoice.Invoke("Hello Daddy."); backGround("An airplane files past."); Console.ReadKey(); } } }
以上就是建立委託的過程了,上面的圖片就是委託的圖解,仍是再說一遍的就是委託的實質就是間接完成某種操做。如何理解這種操做呢?在unity中咱們須要在完成一件事情的狀況下須要接着進行下一件事情,固然你能夠用線程的方式來解決,解決問題的方式有千萬種。由於委託比較方便,因此咱們就會用委託了。指針
還有一點比較重要的是委託實際上是能夠簡寫,就像上面咱們寫的lambda同樣,咱們並不用知道太多的形式,像func。記住一個最簡單與最複雜的其實也是很好的。code
2值/引用傳遞對象
爲何不在上面說這個呢?其實委託其實就是一個引用傳遞。若是在一塊兒說的話,就會概念混亂了,這樣很差。在這個以前的話咱們仍是有一個東西的,顯式類型與隱式類型的,咱們在這裏說說一下但不會往下講,由於在C語言中,真的太多了。像一些你們都有的基本語言,真的不用多說,由於你們都是C語言家族的。如今咱們來看看值類型,值類型就是直接將數字進行傳遞的,int a=10,這個a就是一個值類型。咱們能夠再簡單一下 值就是複製,引用就是獲得地址;改變如今的值不會改變之前的值,改變如今的引用所指向的值,原來的值就會改變。本質就是舊值變不變。blog
下面是哪些是值類型的?哪些是引用類型的?接口
數組是引用類型的。
枚舉是值類型的。
委託是引用類型的。
接口是引用類型的。
類是引用類型的。
結構體是值類型的。
這個裏面還有一個比較重要的知識點就是 拆箱與裝箱
int i=6;
object t=i;
j=(int) t;
裝箱簡單是 將一個值類型的數據給一個引用類型的數據,由於咱們知道這個是不可能的,可是系統會自動給這個值類型的數據建立一個對象,這個t就能夠獲得這個引用了。可是要注意的是,在賦值後這個t與i並無什麼關係了。
拆箱就是,將通常類型變成一個須要的類型,你能夠把它認爲是強制轉換。
再簡單一點 裝箱: 值類型----->引用類型
拆箱: 引用類型---->值類型
這個在本狀況下是正確的,可是在其餘狀況下仍是要再看看的。
下一章要討論的是泛型。這個泛型咱們在unity中仍是見的不少的,它並非陌生的詞。