001-C#1所搭建的核心基礎

今天咱們就要說兩個東西:委託與值/引用類型。數組

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中仍是見的不少的,它並非陌生的詞。

相關文章
相關標籤/搜索