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

2021-06-12 00:05

阅读:653

标签:add   names   静态方法   str   简单的   lan   理解   值类型   复杂   

今天我们就要说两个东西:委托与值/引用类型。

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中还是见的很多的,它并不是陌生的词。

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

标签:add   names   静态方法   str   简单的   lan   理解   值类型   复杂   

原文地址:https://www.cnblogs.com/jake-caiee/p/10541118.html


评论


亲,登录后才可以留言!