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

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

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

时间: 2024-09-28 20:28:47

001-C#1所搭建的核心基础的相关文章

C#复习笔记(2)--C#1所搭建的核心基础

通过对C#1所搭建的核心基础的深入了解,可以知道之后的C#版本在C#1的基础上做了很多扩展,而这些扩展都是基于C#搭建的核心基础而来的. 委托 一.编写委托的过程 委托经常和C语言的"函数指针"挂钩.委托是方法参数化.函数式语言一个重要的表达方式.C#1中编写一个委托要经过四部: 1.声明委托类型 delegate void StringProcessor(string param1); 这个委托指定了一种无返回值,有一个string类型的参数的方法. 这个委托继承自System.Mu

C#1所搭建的核心基础

一,委托 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法接口. 委托类型声明中所描述的类型签名决定了哪个方法可以用于创建委托实例,同时决定了调用的签名:委托类型实际上只是参数类型的一个列表以及一个返回类型 创建委托实例,需要一个方法已经调用该方法的目标: void Invoke(string input)具有个委托相同的类型和相同的参数 委托实例不易变形: 委托是不易变的.委托实例就和string一样.Delegate.Combine和string.Concat很像,都是合并现有的

C# 1.0所搭建的核心基础

2.1委托 不需要直接指定一个要执行的行为,而是将这种行为用某种方式“包含”在一个对象中.这个对象可以像其他任何对象一样使用.在该对象中,可以执行封装的操作.可以将委托类型看作只定义了一个方法的接口,将委托实例看作实现了那个接口的对象. 类似遗嘱,遗嘱由一系列指令组成,比如:“付帐单,捐善款,其余财产留给猫”.去世后,律师会执行这些指令. C#中的委托和现实世界的遗嘱一样,也是要在恰当的时间执行一些列操作.如果代码想要执行操作,但不知道操作细节,一般可以使用委托.  

【深入理解C#】第2章 C#1所搭建的核心基础

1)委托类型 基本理解: 类型安全的函数指针. 可以间接完成某种操作,虽增加了复杂性,但也增加了灵活性. 可以看作方法的占位符. 为什么要用委托: 可以传递函数意味着可以将业务逻辑作为参数传递. 间接调用 想要执行某些操作,但无需知道操作细节(Thread类) 2)C#1的类型系统是静态的,显式的和安全的 静态--编译器知道你能使用哪些成员 显式--必须告诉编译器变量具有什么类型 安全--除非存在真实的转换关系,否则不能将一种类型当作另一种类型 值类型和引用类型 类(使用class声明)是引用类

黑马程序员_Java环境搭建及语言基础

- - - - android培训.java培训.期待与您交流!- - - - - - JRE和JDK JRE:Java Runtime Environment,java运行环境. JDK:Java Development Kit,java开发工具包. 使用JDK开发java程序,交给JRE运行. JDK下载和安装 http://www.oracle.com/technetwork/java/javase/downloads/index.html JDK的目录结构 目录/文件名 功能说明   b

Android核心基础第五天

一.学习目标及要求 课程目标 课程内容(必须讲的内容,就是讲课的知识点的顺序) * 掌握Activity 配置 * 掌握 Intent 显示意图 * 掌握 Intent 隐式意图 * 掌握两种意图的使用场景 * 掌握 activity 开启的数据传递 * 掌握activity的生命周期 * 掌握横竖屏切换的生命周期 * 掌握不同android版本 生命周期的细微差别 * 掌握开启activity获取返回值 * 掌握请求码 结果码的作用 * 掌握程序入口activity配置参数 * 掌握显示意图 

【Windows】Windows Server 2008 R2:核心基础架构

核心基础架构 Windows Server提供了核心基础架构服务以支持网络的运行.Windows Server技术已经成熟了,其中的角色和功能也同样成熟了.Windows Server 2008 R2继续改进了核心基础架构服务,这些服务一直都是Windows Server的一部分,它们为我们的业务提供了一个稳固的基础.点击以下核心基础架构角色以了解更多: Active Directory(AD) 应用程序和Web服务 可用性和可量测性 备份和恢复-Windows Server Backup Br

2.C#1语言核心基础

C#1语言核心基础 本部分将重点讨论C#1语言中的几个核心基础,他们包括:委托.类型系统.值/引用类型 1.委托 委托类似与函数指针,是要在恰当的时间执行的一系列操作,如果代码想要执行操作,但不知道操作细节,就可以使用委托. 简单委托的构成 要执行一个委托必须满足一下4个条件 申明委托类型 创建一个方法包含要执行的代码 创建一个委托实例 调用委托实例 合并和删除委托 上面的例子委托实例都只是一个操作,但是真实情况要稍微复杂一些,委托实例实际有一个操作列表与之关联,这就是调用列表. System.

Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(一)

初学JavaWeb开发,请远离各种框架,从Servlet开始. Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的,仅和Web的请求和响应处理有关,形成一个基础,在开发别的应用项目的时候则可以从这个剥离出来的基础做起,让开发者更关注具体的业务问题,而不是Web的请求和响应的控制. 框架很多,但套路基本类似,帮你隐藏很多关于HTTP协议细节内容,专注功能开发. 但对于一个初学者来说,过早的接触框架往往事倍功半!同样一个问题,换一种