今天我们就要说两个东西:委托与值/引用类型。
1委托。
因为在unity中我们还是用的很少,所以这个委托我就一直不是很明白,所以今天就来说说这个委托到底是什么东西。我其实在unity中用的形式一般是这个样子的。
btn.OnClick.AddListener(()=>{Debug.Log("Hello World")});这个形式是一个Lambda形式,但是在实际事情下还是用的很少,Unity有一点还是不好的,将大部分功能都封装给一个类,我们只需要调用API就行了,但是我们并不知道他们的原理是什么,所以我们知道原理比这里调用API要重要的多。好了,现在在来说说委托到底是什么?委托就是一个引用,就是C语言中的指针。我们希望并不是直接调用这个方法的时候,我们就需要是使用委托,委托也就是间接调用方法,这个委托在使用回调函数的时候用的很多,那我们先来复习一下回调函数吧。A--->B,B运行程序的时候会调用A,A就是回调函数。也就是我们可以把委托当作一个回调函数,因为第一个执行的函数永远不会是A,--->这个箭头也是具有误导人的作用的,并不是A调用B,而是将A给B ,再由B来调用A。
现在在来说说委托中的两个令人蛋疼的名词--委托类型与委托实例。其实我们现在来看的话,也是没有社么难度的,一个类型一个实例简直是简单的不要不要的,但是总是有人把它们两个当作委托,其实不是这个样子的,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。记住一个最简单与最复杂的其实也是很好的。
2值/引用传递
为什么不在上面说这个呢?其实委托其实就是一个引用传递。如果在一起说的话,就会概念混乱了,这样不好。在这个之前的话我们还是有一个东西的,显式类型与隐式类型的,我们在这里说说一下但不会往下讲,因为在C语言中,真的太多了。像一些大家都有的基本语言,真的不用多说,因为大家都是C语言家族的。现在我们来看看值类型,值类型就是直接将数字进行传递的,int a=10,这个a就是一个值类型。我们可以再简单一下 值就是复制,引用就是得到地址;改变现在的值不会改变以前的值,改变现在的引用所指向的值,原来的值就会改变。本质就是旧值变不变。
下面是哪些是值类型的?哪些是引用类型的?
数组是引用类型的。
枚举是值类型的。
委托是引用类型的。
接口是引用类型的。
类是引用类型的。
结构体是值类型的。
这个里面还有一个比较重要的知识点就是 拆箱与装箱
int i=6;
object t=i;
j=(int) t;
装箱简单是 将一个值类型的数据给一个引用类型的数据,因为我们知道这个是不可能的,但是系统会自动给这个值类型的数据创建一个对象,这个t就可以得到这个引用了。但是要注意的是,在赋值后这个t与i并没有什么关系了。
拆箱就是,将一般类型变成一个需要的类型,你可以把它认为是强制转换。
再简单一点 装箱: 值类型----->引用类型
拆箱: 引用类型---->值类型
这个在本情况下是正确的,但是在其他情况下还是要再看看的。
下一章要讨论的是泛型。这个泛型我们在unity中还是见的很多的,它并不是陌生的词。
原文地址:https://www.cnblogs.com/jake-caiee/p/10541118.html