C#核心知识回顾——11.各数据集合的汇总区分、委托、事件、匿名函数

news2024/11/17 12:20:45

变量:

无符号
byte正8位  ushort正16位  uint正32位  ulong正64位
有符号
sbyte8位  short16位  int32位  long64位
浮点数
float double decimal
特殊
char bool string

复杂数据容器:

枚举enum
结构体struct
数组(一维、二维、交错) [] [,] [][]

数据集合:

using System.Collections;
ArrayList object数据列表
stack 栈 先进后出
Queue 队列 先进先出
Hashtable 哈希表 键值对

泛型数据集合:

using system.Collections.Generic;
List 列表 泛型列表
Dictionary 字典 泛型哈希表
LinkedList 双向链表
statck 泛型栈
Queue 泛型队列

2.委托

委托是函数(方法)的容器
可以理解为表示函数(方法)的变量类型
用来存储、传递函数(方法)
委托的本质是一个类,用来定义函数(方法)的类型(返回值和参数的类型)
不同的函数(方法)必须对应和各自"格式"一致的委托

关键字:delegate

语法:访问修饰符delegate返回值委托名(参数列表);

可以申明在namespace和class语句块中
更多的写在namespace中
简单记忆委托语法就是函数申明语法前面加一个delegate关键字

声明:

 /// <summary>
    /// 声明了一个可以存储无参无返回值的函数容器
    /// </summary>
    delegate void MyFun();

    //委托声明不能重名(同一语句块)    
    delegate int MyFunc(int a);

使用:

public class test : MonoBehaviour
{    
    /// <summary>
    /// 使用过程
    /// </summary>
    private void Start()
    {
        //无参无返回值委托使用
        MyFun mf = new MyFun(Fun);
        mf.Invoke();
        mf();
        //有参有返回值委托使用
        MyFunc mfc = new MyFunc(Fun2);
        mfc.Invoke(1);
        mfc(2);

        Tet tet = new Tet();
        tet.TestFun(Fun, Fun2);
    }  
    void Fun()
    {
        Debug.Log("fun");
    }
    int Fun2(int a)
    {
        Debug.Log("fun2" + a);
        return a;
    }
}
/// <summary>
/// 声明了一个可以存储无参无返回值的函数容器
/// </summary>
delegate void MyFun();

//委托声明不能重名(同一语句块)    
delegate int MyFunc(int a);

// 委托常用在:
//1.作为类的成员
//2.作为函数的参数
class Tet
{
    public MyFun mf;
    public MyFunc mfc;

    public void TestFun(MyFun mf,MyFunc mfc)
    {
        //可以先处理一些别的逻辑,完事后在执行函数
        this.mf = mf;
        this.mfc = mfc;
    }
}

多函数储存:

public class test : MonoBehaviour
{    
    /// <summary>
    /// 使用过程
    /// </summary>
    private void Start()
    {
        //委托存储多个函数
        //增
        MyFun mf = Fun;
        mf += Fun2;        
        //减(多减不会报错)
        mf -= Fun2;
        //清空容器
        mf = null;
    }  
    void Fun()
    {
        Debug.Log("fun");
    }
    void Fun2()
    {
        Debug.Log("fun2");
    }
}

delegate void MyFun();

系统定义好的委托:

public class test : MonoBehaviour
{    
    /// <summary>
    /// 使用过程
    /// </summary>
    private void Start()
    {
        //无参无返回值
        Action action = Fun;
        action += Fun2;
        action();

        //泛型委托
        Func<string> FuncStr = Func3;

        //可传n参委托
        Action<int, string> action1 = Fun4;
        //可传n参委托。有返回值
        Func<int,int> FuncStr2 = Fun5;
    }
    void Fun(){ Debug.Log("fun"); }
    void Fun2(){ Debug.Log("fun2"); }
    string Func3(){ return ""; }
    void Fun4(int a ,string b) { }
    int  Fun5(int a){ return 0; }
}

delegate void MyFun();

3.事件

事件是什么:
事件是基于委托的存在
事件是委托的安全包裹
让委托的使用更具有安全性
事件 是一种特殊的变量类型

二事件的使用
1.事件是作为 成员变量存在于类中
2.委托怎么用 事件就怎么用

事件相对于委托的区别:
1.不能在类外部 赋值
2.不能再类外部 调用

注意:
它只能作为成员存在于类和接口以及结构体中

public class test : MonoBehaviour
{    
    
    private void Start()
    {
        Tes tes = new Tes();
        tes.myFun = null;
        tes.myFun = TestMyFun;

        //事件不可以在类外部赋值
        //tes.myEvent = null;
        //tes.myEvent = TestMyFun;
        //但是事件可以在外部+=、-=
        tes.myEvent += TestMyFun;
        tes.myEvent -= TestMyFun;

        tes.myFun();
        tes.myFun.Invoke();
        //事件不能在外部调用
        //tes.myEvent();
        //tes.myEvent.Invoke();
        //只能在类内部封装方法去调用
    }
    void TestMyFun() { }
}
class Tes
{
    //委托成员,存储函数
    public Action myFun;
    //事件成员,存储函数
    public event Action myEvent;

    //构造函数
    public Tes(){
        //事件的使用和委托一样
        myFun = TestFun;
        myFun += TestFun;
        myFun -= TestFun;
        myFun();

        myEvent = TestFun;
        myEvent += TestFun;
        myEvent -= TestFun;
        myEvent();
    }

    public void TestFun()
    {
        Debug.Log("122");
    }
}

事件相当于对委托进行了一次封装,更安全。

public class test : MonoBehaviour
{    
    
    private void Start()
    {
        Heater ht = new Heater();
        Alarm alarm = new Alarm();
        Display display = new Display();

        ht.HeaterEvent += alarm.OnAlert;
        ht.HeaterEvent += display.OnDisplay;
        ht.Controll();
    }
}
public class Heater
{
    public delegate void HeaterDelegate(int alert);
    public event HeaterDelegate HeaterEvent;

    private int time;
    public void Controll()
    {
        for (int i = 0; i <= 100; i++)
        {
            time = i;
            if(time > 95)
            {
                if(HeaterEvent != null)
                {
                    HeaterEvent(time);
                }
            }
        }
    }
}

public class Alarm
{
    public void OnAlert(int alert)
    {
        Debug.Log("alarm:已经"+ alert + "度了");
    }
}
public class Display
{
    public void OnDisplay(int alert)
    {
        Debug.Log("Display:烧到" + alert + "度了,可以褪猪毛啦");
    }
}

4.匿名函数

public class test : MonoBehaviour
{    
    
    private void Start()
    {
        //1.无参无返回
        //这样申明匿名函数 只是在申明函数而已 还没有调用
        //真正调用它的时候是这个委托容器啥时候调用就什么时候调用这个匿名函数                
        Action a = delegate ()
        {
            Debug.Log("匿名函数");
        };

        a();
        //2.有参
        Action<int, string> action = delegate (int i, string b)
        {
            Debug.Log("带参匿名");
        };

        action(1,"1");
        //3.有返回值
        Func<int,string> c = delegate (int i)
        {
            return "111";
        };
        //4.一般情况会作为函数参数传递 或者 作为函数返回值
        //参数传递
        Tes tes = new Tes();
        tes.DosThing(100, delegate ()
        {
            Debug.Log("100");
        });
        //返回值
        Action ac2 = tes.GetFun();
        ac2();
        //或者写成:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        tes.GetFun()();
    }

}

class Tes
{
    public Action action1;
    //作为参数传递
    public void DosThing(int a,Action fun)
    {
        Debug.Log(a);
        fun();
    }
    //作为返回值
    public Action GetFun()
    {
        return delegate ()
        {
            Debug.Log("函数内部返回的匿名函数");
        };
    }
}

注意:

因为匿名函数没有名字 所以没有办法指定移除某一个匿名函数

想要移除匿名函数只能清空委托。

所以如果只监听一个函数可以使用匿名函数,监听多个就不要用匿名函数

 

public class test : MonoBehaviour
{    
    
    private void Start()
    {        
        Tes tes = new Tes();
        Func<int,int> fun = tes.GetFun(4);
        fun(2);
    }

}

class Tes
{
    public Func<int,int> GetFun(int m)
    {
        return delegate (int a)
        {
            Debug.Log("函数内部返回的匿名函数"+a*m);
            return a * m;
        };
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT 提示词设置

提示词 Prompt&#xff08;提示词&#xff09;&#xff1a;当我们询问GPT时&#xff0c;发送的消息就是Prompt。 通过给出合适的Prompt&#xff0c;可以让GPT了解我们的想法&#xff0c;在根据我们的想法做出更加合适的判断&#xff0c;帮助我们完成任务&#xff0c;提高效率。…

Oracle存储过程的使用DEMO(一)

文章目录 Oracle存储过程的使用DEMO&#xff08;一&#xff09;1. Oracle中块的使用2. IF使用2.1 IF...ELSE...2.2 IF嵌套 3. CASE...WHEN...4. LOOP5. WHILE6. FOR Oracle存储过程的使用DEMO&#xff08;一&#xff09; 1. Oracle中块的使用 DECLAREI NUMBER; BEGINSELECT EM…

Obfuscar的使用

1、在程序中nuget安装Obfuscar 2、在工程中新建Obfuscar.xml文件&#xff0c;内容如下 <?xml version1.0?> <Obfuscator><!-- 输入的工作路径&#xff0c;采用如约定的 Windows 下的路径表示法&#xff0c;如以下表示当前工作路径 --><!-- 推荐使用当前…

【Spring】项目创建和使用

一、Spring 的概念 Spring : 包含众多工具方法的 IoC 容器。 Spring 的核心 &#xff1a;IoC &#xff08;控制反转&#xff09;&#xff0c; DI (依赖注入)。 loC &#xff08;Inversion of Control&#xff09;翻译成中文就是 “控制反转” 的意思&#xff0c;控制反转一种…

嵌入式QT- QT使用MQTT

目录 一、MQTT介绍 二、MQTT概念 2.1 订阅(Subscribtion) 2.2 会话&#xff08;Session&#xff09; 2.3 主题名&#xff08;Topic Name&#xff09; 2.4 主题筛选器&#xff08;Topic Filter&#xff09; 2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平…

2.1.cuda驱动API-概述

目录 前言1. Driver API概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记 本次课程学习精简 CUDA 教程-Driver API 概述 课程大纲可看下…

【UE】点击场景中的物体生成介绍标签

效果 步骤 首先创建一个控件蓝图添加如下控件 给水平框控件添加了一段动画&#xff0c;让该控件显示2秒钟&#xff0c;然后在2~3秒间位置上移并且不透明度减少 在图表中播放动画&#xff0c;延迟3秒后移除控件蓝图 在玩家控制的Pawn中添加如下节点 首先由“由通道检测线条”节…

基于Swing的校园管理系统

1 引言 1.1项目背景 我校积极举办组织学生参加各级各种科技、文艺、体育等校园文化活动&#xff0c;寓思想品德教育于生动活泼、形象具体的校园文化活动中。由于学校各级通讯不太方便&#xff0c;活动筹备过程中&#xff0c;无论是活动参与者的报名、观众的报名还是组织者的…

Image Sensor的FSIN/VSYNC

本文介绍Image Sensor的FSIN/VSYNC。 产品开发过程(比如3D成像)中&#xff0c;有时会遇到需要2个及以上的Image Sensor同步采集&#xff0c;因此&#xff0c;Image Sensor厂家对于他们的产品都提供了同步功能&#xff0c;也就是我们经常所见的FSIN/VSYNC(OV),XVS(Sony IMX3系列…

飞行动力学 - 第6节-part1-喷气式飞机的航时及等高航程 之 基础点摘要

飞行动力学 - 第6节-part1-喷气式飞机的航时及等高航程 之 基础点摘要 1. 续航性能2. 巡航受力运动方程3. 喷气式飞机3.1 航时3.2 航程3.3 等高巡航 4. 参考资料 1. 续航性能 耗油率航程航时 2. 巡航受力运动方程 6个方程表达式来进行表达&#xff1a; 3. 喷气式飞机 3.1 …

chatgpt api + function calling + 高德天气API + google custom search【联谷歌,联高德】

OpenAI 发布几个重磅更新 1、 开放 16k 上下文的 GPT-3.5-Turbo 模型&#xff08;gpt-3.5-turbo-16k&#xff09;&#xff0c;是目前的4倍 2、 新的 GPT-4 和 3.5 Turbo 模型 3、Chat Completions API 中的新增加函数调用功能 &#xff08;实时获取网络数据成为可能&#xff0…

SpringBoot2+Vue2实战(十二)springboot一对一,一对多查询

新建数据库表 Course Data TableName("t_course") public class Course implements Serializable {private static final long serialVersionUID 1L;/*** id*/TableId(value "id", type IdType.AUTO)private Integer id;/*** 课程名称*/private String…

如何成为微软MVP?

对一个普通的开发人员来说&#xff0c;最大的认可就是得到微软官方的MVP 认证了&#xff0c;是一份对技术人的荣誉证书。 微软的MVP是相对公平公正的&#xff0c;只要你热爱技术&#xff0c;热爱分享&#xff0c;在一定的领域里有足够的深度&#xff0c;就会得到微软官方的认证…

【沐风老师】3dMax使用Dreamscape插件创建漂亮的日落场景教程

在本教程中,您将学习如何利用3dMax和DreamScape在平静的海面上创造一个美丽的日落效果。DreamScape是3dMax的一套复杂的插件,可以让你创造和呈现现实的景观、海景、天空、云层、户外照明等等。 【最后效果预览】 步骤1&#xff1a;首先,要用DreamScape来呈现一个场景,你需要创…

【Linux学习】日积月累——进程(1)

一、背景 1.1 冯诺依曼体系结构 我们常见的计算机、服务器等设备大部分遵循冯诺依曼体系。 图1 冯诺依曼体系结构 当前&#xff0c;我们所认识的计算机&#xff0c;主要由各类硬件组成&#xff1a; 输入单元&#xff1a;包含键盘、鼠标、扫描仪、写板等&#xff1b;中央处理器…

Unity游戏开发之游戏动画(Unity动画系统)

文章目录 Unity动画系统动画片段 Animation Clip在Unity中制作动画动画复用 替身系统 AvatarAnimator 组件 Animator Component动画状态机 Animator Controller动画状态动画状态的类型动画状态的属性 动画状态机----动画转换转换属性的配置面板 、、、、 Unity动画系统 Unity动…

selenium 02

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 等待浏览器的操作键盘事件鼠标事件定位一组元素多层框架定位下拉框处理弹窗处理上传文件操作关闭浏览器切换窗口截图 等待 s…

SOLIDWORKS小问题解答 硕迪科技

众所周知&#xff0c;SOLIDWORKS的使用者非常多&#xff0c;在使用过程中呢也会有一些小问题&#xff0c;前几天就有朋友来咨询了两个问题&#xff0c;可能其他使用者也有这样的问题&#xff0c;所以今天硕迪科技统一为大家解答 问题一&#xff1a;SOLIDWORKS装配图中的颜色怎么…

csv文件如何在单元格内保留换行 \r\n

csv文件如何在单元格内保留换行 \r\n 一、问题描述 我们都知道 csv 文件内是通过 , 来切分单元格的。 但如果某个单元格内的内容有换行&#xff1a; 34, KyleBing, 你好 # 这里换行了 我的名字是 kyebing 35, Tina, hello 36, Lucy, nice to meet you当用 Excel 打开的时候…

如何使Revit导出带有标准材质的FBX模型?

如何使Revit导出带有标准材质的FBX模型&#xff1f; 初次使用Revit导出fbx格式模型&#xff0c;在导出模型后发现模型材质丢失了&#xff0c;上网查询之后也没到具体原因是什么&#xff0c;不过倒是找到了解决方式&#xff1a;在Revit中安装naviswork插件&#xff0c;然后从re…