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.hqwc.cn/news/458454.html

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

相关文章

【网站项目】035家居商城系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Java程序设计】【C00248】基于Springboot的摄影跟拍预定管理系统(有论文)

基于Springboot的摄影跟拍预定管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的摄影跟拍预定管理系统 本系统分为系统功能模块、管理员功能模块、摄影师功能模块以及用户功能模块。 系统功能模块&#xf…

LeetCode:14.最长公共前缀

14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 思路&#xff1a; 代码有限注释&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路&#xff1a; 仅有一种&#xff0c;LeetCode的四种解法&#xff0c;三种都是来水的&#…

Qt事件机制

文章目录 1 事件机制2 ignore 和 accept3 bool event(QEvent *event);4 bool eventFilter(QObject *watched, QEvent *event);5 总结 1 事件机制 事件传递图&#xff1a; 记录一下事件的传递顺序&#xff0c;主要围绕 QEventFilter, QEvent, QKeyEvent等事件展开&#xff1a…

【React】如何使antd禁用状态的表单输入组件响应点击事件?

最近遇到一个需求&#xff0c;需要在<Input.textarea>组件中&#xff0c;设置属性disabled为true&#xff0c;使textarea响应点击事件&#xff0c;但直接绑定onClick并不会在禁用状态下被响应。 解决方法1 之后尝试了很多方法&#xff0c;比如设置csspointer-events:no…

电脑没有声音是怎么回事?几招快速解决

当电脑突然失去声音&#xff0c;这可能成为一种令人烦恼的体验&#xff0c;尤其是在你期望享受音乐、观看视频或进行在线会议的时候。幸运的是&#xff0c;大多数时候&#xff0c;电脑没有声音的问题是可以迅速解决的。电脑没有声音是怎么回事&#xff1f;本文将为你介绍一些常…

统信UOS_麒麟KYLINOS上不覆盖高版本依赖包的情况下批量安装软件

原文链接&#xff1a;统信UOS/麒麟KYLINOS上在不覆盖高版本依赖包的情况下批量安装软件 大家好&#xff01;在使用基于Debian的Linux发行版&#xff0c;如统信UOS和麒麟KYLINOS时&#xff0c;deb包作为软件安装包的格式非常常见。今天&#xff0c;我将为大家带来一个实用的技术…

伦敦金交易平台:了解交易背后的世界

伦敦金交易平台是全球金融市场中备受关注的重要平台之一。作为国际金融中心&#xff0c;伦敦汇聚了众多金融机构和投资者&#xff0c;其金交所成为全球最大的现货黄金市场。在这个繁荣蓬勃的市场中&#xff0c;交易活跃&#xff0c;投资机会多样&#xff0c;吸引了众多投资者前…

react+antd+CheckableTag实现Tag标签单选或多选功能

1、效果如下图 实现tag标签单选或多选功能 2、环境准备 1、react18 2、antd 4 3、功能实现 原理: 封装一个受控组件&#xff0c;接受父组件的参数&#xff0c;数据发现变化后&#xff0c;回传给父组件 1、首先&#xff0c;引入CheckableTag组件和useEffect, useMemo, use…

Docker-Learn(一)使用Dockerfile创建Docker镜像

1.创建并运行容器 编写Dockerfile&#xff0c;文件名字就是为Dockerfile 在自己的工作工作空间当中新建文件&#xff0c;名字为Docerfile vim Dockerfile写入以下内容&#xff1a; # 使用一个基础镜像 FROM ubuntu:latest # 设置工作目录 WORKDIR /app # 复制当前目…

2024-02-07(Sqoop,Flume)

1.Sqoop的增量导入 实际工作中&#xff0c;数据的导入很多时候只需要导入增量的数据&#xff0c;并不需要将表中的数据每次都全部导入到hive或者hdfs中&#xff0c;因为这样会造成数据重复问题。 增量导入就是仅导入新添加到表中的行的技术。 sqoop支持两种模式的增量导入&a…

林浩然与杨凌芸的Java奇缘:final关键字的三次浪漫邂逅

林浩然与杨凌芸的Java奇缘&#xff1a;final关键字的三次浪漫邂逅 Lin Haoran and Yang Lingyun’s Java Romance: Three Romantic Encounters with the “final” Keyword 在一个名叫“编程乐园”的世界里&#xff0c;住着两位才子佳人——男主角林浩然和女主角杨凌芸。他们不…