Unity C#进阶案例 “泛型编程”

文章目录

      • 泛型基础
      • 示例1:泛型类与方法
      • 示例2:泛型方法
      • 示例3:泛型约束
      • 示例4:泛型委托与事件
      • 示例5:泛型单例模式(Unity)

在Unity中,C#的泛型编程是一种强大的工具,它允许你编写可复用且类型安全的代码。以下将详细讲解泛型,并通过五个代码实例来展示其在Unity中的实际应用。

泛型基础

什么是泛型?
泛型是C#中的一种特性,它允许你在定义类、接口、方法或委托时,指定一个或多个类型参数。这些类型参数在编译时由实际的类型替换,从而创建特定类型的实例。这样可以确保数据类型的一致性,并避免不必要的装箱和拆箱操作,提高性能和安全性。

例如:

public class MyGenericClass<T>
{public T Value { get; set; }
}

在这个例子中,T是一个类型参数,当创建MyGenericClass<int>MyGenericClass<string>等实例时,T会被具体的数据类型替代。

示例1:泛型类与方法

场景:一个通用容器类,用于存储任意类型的数据。

// 定义泛型类
public class DataContainer<T>
{private T data;public void SetData(T value){data = value;}public T GetData(){return data;}
}// 使用
var intContainer = new DataContainer<int>();
intContainer.SetData(42);
int number = intContainer.GetData(); // number 现在是 42var stringContainer = new DataContainer<string>();
stringContainer.SetData("Hello, World!");
string message = stringContainer.GetData(); // message 现在是 "Hello, World!"

示例2:泛型方法

场景:一个交换两个变量值的方法,适用于任何引用类型或值类型。

public static class Utilities
{// 泛型方法public static void Swap<T>(ref T a, ref T b){T temp = a;a = b;b = temp;}
}// 使用
int x = 10, y = 20;
Utilities.Swap(ref x, ref y); // 交换后,x=20, y=10string first = "Alice", second = "Bob";
Utilities.Swap(ref first, ref second); // 交换后,first="Bob", second="Alice"

示例3:泛型约束

场景:一个泛型类需要限制只能处理实现了某个接口的类型。

public interface IComparable<T>
{int CompareTo(T other);
}public class SortableList<T> where T : IComparable<T>
{private List<T> list = new List<T>();public void Add(T item){list.Add(item);}public void Sort(){list.Sort((a, b) => a.CompareTo(b));}
}// 使用
class CustomType : IComparable<CustomType>
{public int CompareTo(CustomType other){// 实现比较逻辑}// ...
}SortableList<CustomType> customList = new SortableList<CustomType>();
customList.Add(new CustomType());
customList.Sort();

示例4:泛型委托与事件

场景:一个通用事件处理器,接受任何类型的参数。

public delegate void GenericEventHandler<T>(object sender, T args);public class EventManager
{public event GenericEventHandler<string> OnStringEvent;public event GenericEventHandler<Vector3> OnVector3Event;public void RaiseStringEvent(string message){OnStringEvent?.Invoke(this, message);}public void RaiseVector3Event(Vector3 position){OnVector3Event?.Invoke(this, position);}
}// 使用
EventManager manager = new EventManager();manager.OnStringEvent += (sender, message) => Debug.Log($"String event: {message}");
manager.OnVector3Event += (sender, position) => Debug.Log($"Vector3 event: {position}");manager.RaiseStringEvent("Hello");
manager.RaiseVector3Event(new Vector3(1, 2, 3));

示例5:泛型单例模式(Unity)

场景:创建一个可以在Unity中重用的泛型单例类。

public class Singleton<T> : MonoBehaviour where T : Singleton<T>
{protected static T _instance;public static T Instance{get{if (_instance == null){_instance = FindObjectOfType<T>();if (_instance == null){GameObject obj = new GameObject(typeof(T).Name);_instance = obj.AddComponent<T>();}}return _instance;}}protected virtual void Awake(){if (_instance != this){Destroy(gameObject);return;}DontDestroyOnLoad(gameObject);}
}// 使用
public class GameManager : Singleton<GameManager>
{// 游戏管理器的具体实现...
}

以上五个示例展示了泛型在Unity项目中的不同应用场景,从简单的数据容器到复杂的事件处理和设计模式实现。通过使用泛型,可以有效减少重复代码,增强代码的灵活性和可扩展性。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

Kylin下Qt找不到打印机解决方案

不知道各位老铁是否也碰到了麒麟系统下&#xff0c;qt编出来的程序打印机只能找到pdf的那个&#xff0c;其他的打印机都找不到&#xff0c;但是系统自带的qt编译的程序就可以。 解决思路&#xff1a; 1.系统自带的可以&#xff0c;自己编译的qt却不可以&#xff0c;说明自己编…

【代码随想录24】93.复原 IP 地址 78.子集 90.子集II

目录 93.复原IP地址题目描述参考代码 78.子集题目描述参考代码 90.子集II题目描述参考代码 93.复原IP地址 题目描述 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如…

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在当今科技飞速发展的时代&#xff0c;我们身边充斥着各种智能设备&#xff0c;然而&#xff0c;如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目&#xff0c;通过手势…

30s速通String——从JVM内存 到相关方法

0.深度理解String&#xff08;初学者可后面再看&#xff09; 1.JVM理解两种初始化String方式 1.1直接初始化 栈中保存变量s1,s2&#xff0c;而变量保存“abc”在方法区的地址 这里当“abc”具有唯一性&#xff0c;字符串常量区无此字符串&#xff0c;我们就产生一个新内存“…

AI数字人训练数据集汇总

唇读&#xff08;Lip Reading&#xff09;&#xff0c;也称视觉语音识别&#xff08;Visual Speech Recognition&#xff09;&#xff0c;通过说话者口 型变化信息推断其所说的内容&#xff0c;旨在利用视觉信道信息补充听觉信道信息&#xff0c;在现实生活中有重要应用。例如&…

QT Linux下无法使用CTRL+ALT+P快捷键,不生效

文章目录 一、背景二、排查&#xff08;1&#xff09;检查创建&#xff0c;发现没问题。&#xff08;2&#xff09;查看 shortcutMap 是否注册&#xff08;3&#xff09;排查xcb有没有获取到该事件&#xff08;4&#xff09;排查是否是系统的问题&#xff08;5&#xff09;www.…

2024.1.28力扣每日一题——水壶问题

2024.1.28 题目来源我的题解方法一 深度搜索&#xff08;DFS&#xff09;/广度搜索&#xff08;BFS&#xff09;方法二 数学 题目来源 力扣每日一题&#xff1b;题序&#xff1a;365 我的题解 方法一 深度搜索&#xff08;DFS&#xff09;/广度搜索&#xff08;BFS&#xff…

反射的理解

反射是指在运行时动态地获取和操作类的信息&#xff08;如类的属性、方法、构造函数等&#xff09;&#xff0c;以及对对象进行动态调用和操作的能力。通过反射&#xff0c;可以在编译时无法确定的情况下&#xff0c;获取、操作和创建类的实例。 适用场景&#xff1a; 编写通用…

Kafka下载(kafka和jdk、zookeeper、SpringBoot的版本对应关系)

文章目录 一、准备工作1、必须环境2、kafka使用自带的zookeeper还是自己单独部署zookeeper?二、下载一、准备工作 1、必须环境 kafka本身的开发语言是Scala,而Scala是基于jdk开发的,所以要先安装jdk kafka版本jdk版本kafka使用jdk版本官网说明1.0建议使用1.8https://kafka.…

TCP 粘包/拆包

文章目录 概述粘包拆包发生场景解决TCP粘包和拆包问题的常见方法Netty对粘包和拆包问题的处理小结 概述 TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中&#xff0c;比如RPC框架、Netty等 TCP 粘包/拆包 就是你基于 TCP 发送数据的时候&#xff0c;出现了多个字符串“粘”…

前端页面禁止debugger调试并跳转空白页面----文心一言官网实现方式

技术点&#xff1a;setInterval定时器Object.defineProperty 背景&#xff1a; 某天打开文心一言想看看接口返回结构是怎样的&#xff0c;熟练的打开浏览器开发者工具查看网络请求。 发现出现了以下debugger断点 这难不倒我&#xff0c;去掉断点调试&#xff0c;继续下一步不…

MyBatis多数据源以及动态切换实现(基于SpringBoot 2.7.x)

MyBatis多数据源以及动态切换实现可以实现不同功能模块可以对应到不同的数据库&#xff0c;现在就让我们来讲解一下。 目录 一、引入Maven二、配置文件三、实现多数据源四、动态切换数据源 一、引入Maven 注意&#xff1a;博主这边使用的springboot版本是2.7.14的 <!-- htt…

正则表达式 regex

文章目录 参考 参考 https://blog.csdn.net/Conradine_Lian/article/details/108890595 regex可以很简单 也可以很复杂 /* 限定符 修饰前面的一个字符,可以是元字符* 重复0次或更多次 重…

计算机系统基本概念白话解释

时钟&#xff08;Clock&#xff09; 时钟是计算机系统中的一个关键组件&#xff0c;它负责生成一系列的定时信号&#xff0c;以驱动计算机的各种操作和组件。时钟通常以固定的频率发出脉冲信号&#xff0c;这个频率称为时钟频率。时钟频率决定了计算机系统的运行速度。CPU、内…

Python脚本之操作Elasticsearch【二】

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/124640467 之前分享过 使用elasticsearch库【一】https://blog.csdn.net/zyooooxie/article/details/109588072 &#xff0c; 继续分享…

查询每张表占用磁盘空间大小(达梦数据库)

查询每张表占用磁盘空间大小 环境介绍 环境介绍 在迁移准备工作中,为了更好评估迁移时间,可以统计大表数量与大表的实际大小,为迁移规划做准备 --查看用户下面每张表占用的磁盘空间SELECT T.OWNER,T.SEGMENT_NAME,T.SEGMENT_TYPE,T.TABLESPACE_NAME,T.BYTES,T.BYTES/1024 BYT…

OpenHarmony开源鸿蒙开发之旅

文章目录 一、op系统架构二、op系统构建1. op源代码目录2. op系统构建3. op开发环境搭建 三、op系统的子系统四、op系统芯片移植五、op系统启动流程六、op系统组件七、驱动框架 一、op系统架构 二、op系统构建 1. op源代码目录 2. op系统构建 3. op开发环境搭建 三、op系统…

4、安全开发-Python-蓝队项目流量攻击分析文件动态监控图片隐写技术

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 总结&#xff1a; &#xff08;1&#xff09;使用python脚本Scapy库实现指定网卡的流量抓包分析 &#xff08;2&#xff09;使用python脚本Watchdog实现指定目录文件行为监控 &#xff08;…

LeetCode:26.删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 思路&#xff1a; 代码注释&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路&#xff1a; 没啥特殊的&#xff0c;老老实实双指针遍历数组&#xff0c;&#xff0…

获取旁站 / C 段:第三方网站(附链接)

一、介绍 1.1 旁段 在网络安全的上下文中&#xff0c;"旁段"&#xff08;Pivot&#xff09;是指攻击者通过入侵一个网络中的一台计算机&#xff0c;然后利用该计算机作为跳板&#xff08;或者称之为“旁道”&#xff09;来访问其他计算机或网络资源的行为。 攻击者…