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

news2024/9/21 22:52:41

文章目录

      • 泛型基础
      • 示例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 现在是 42

var 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=10

string 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.coloradmin.cn/o/1437175.html

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

相关文章

对网络流水印的调查

文章信息 论文题目&#xff1a;Network Flow Watermarking: A Survey 期刊&#xff08;会议&#xff09;&#xff1a; IEEE Communications Surveys & Tutorials 时间&#xff1a;2016 级别&#xff1a;中科院1区 文章链接&#xff1a;https://ieeexplore.ieee.org/stamp/…

JCTC | 利用几何深度学习对蛋白质-配体结合pose进行等变灵活建模

Overview 该论文解决了药物开发中蛋白质-配体复合结构灵活建模的挑战。作者提出了一种名为FlexPose的新型深度学习框架&#xff0c;它可以直接对复杂结构进行建模&#xff0c;而不需要传统的采样和评分策略。 该模型结合了标量-向量双特征表示和 SE(3)等变网络设计来处理动态结…

AI数字人训练数据集汇总

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

SpringCloud-创建多模块项目

在微服务架构中&#xff0c;项目的组织结构对于代码的维护和团队的协作至关重要。Spring Cloud作为一个强大的微服务框架&#xff0c;提供了丰富的功能和组件&#xff0c;同时也支持多模块项目的创建&#xff0c;使得代码结构更加清晰、易于管理。本文将介绍如何使用 Spring Cl…

【教程】Linux使用git自动备份和使用支持文件恢复的rm命令

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 首先非常不幸地告诉你&#xff1a;Linux 系统的标准 rm 命令不支持文件恢复功能。一旦使用 rm 删除了文件或目录&#xff0c;它们就会从文件系统中永久删除&#xff0c;除非你使用专门的文件恢复工具尝试…

华视 CVR-100UC 身份证读取 html二次开发模板

python读卡&#xff1a;python读卡 最近小唐应要求要开发一个前端的身份证读卡界面&#xff0c;结果华视CVR-100UC 的读取界面是在是有点&#xff0c;而且怎么调试连官方最基本的启动程序都执行不了。CertReader.ocx 已成功&#xff0c;后面在问询一系列前辈之后&#xff0c;大…

clickhouse计算前后两点间经纬度距离

问题 计算如图所示前后两点经纬度的距离&#xff1f; 方法 1、用开窗函数将如图所示数据下移一行 selectlongitude lon1,latitude lat1,min(longitude) over(order by time1 asc rows between 1 PRECEDING and 1 PRECEDING) lon2,min(latitude) over(order by time1 asc row…

当AGI遇到人形机器人

为什么人类对人形机器人抱有执念 人形机器人是一种模仿人类外形和行为的机器人&#xff0c;它的研究和开发有着多方面的目的和意义。 人形机器人可以更好地适应人类的环境和工具。人类的生活和工作空间都是根据人的尺寸和动作来设计的&#xff0c;例如门、楼梯、桌椅、开关等…

掌握Go的加密技术:crypto/rsa库的高效使用指南

掌握Go的加密技术&#xff1a;crypto/rsa库的高效使用指南 引言crypto/rsa 库概览RSA 加密算法基本原理crypto/rsa 库的功能和应用 安装和基本设置在 Go 项目中引入 crypto/rsa 库基本环境设置和配置 密钥生成与管理生成 RSA 密钥对密钥存储和管理 加密和解密操作使用 RSA 加密…

改进神经网络

Improve NN 文章目录 Improve NNtrain/dev/test setBias/Variancebasic recipeRegularizationLogistic RegressionNeural networkother ways optimization problemNormalizing inputsvanishing/exploding gradientsweight initializegradient checkNumerical approximationgrad…

如何启动若依框架

Mysql安装 一、下载 链接&#xff1a;https://pan.baidu.com/s/1s8-Y1ooaRtwP9KnmP3rxlQ?pwd1234 提取码&#xff1a;1234 二、安装(解压) 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹)&…

python二维数组初始化的一个极其隐蔽的bug(浅拷贝)

初始化一个三行三列的矩阵 m n 3初始化方式1 a [[0 for i in range(m)] for j in range(n)]初始化方式2 b [] row [0 for i in range(0,m)] for i in range(0,n):b.append(row)分别输出两个初始化的结果 for row in a:print(row) for row in b:print(row)当前的输出为…

nba2k24 周琦面补

nba2k24 周琦面补 nba2k23-nba2k24通用 周琦面补 下载地址&#xff1a; https://www.changyouzuhao.cn/9649.html

AJ-Report 【开源的一个BI平台】

AJ-Report是全开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。     多数据源支持&#xff0c;内置mysql、elasticsearch、kudu驱动&#xff0c;支持自定义数据集省去数据接口开发&#xff0c;目前已支持30…

第7章——深度学习入门(鱼书)

第7章 卷积神经网络 本章的主题是卷积神经网络&#xff08; Convolutional Neural Network &#xff0c; CNN &#xff09;。CNN 被用于图像识别、语音识别等各种场合&#xff0c;在图像识别的比赛中&#xff0c;基于深度学习的方法几乎都以 CNN 为基础。本章将详细介绍 CNN 的…

好看的安全跳转单页html源码

好看的安全跳转单页html源码,效果如下 代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <!--[if IE 8]><style>.ie8 .alert-circle,.ie8 .alert-footer{display:none}.ie8 .alert-box{padding-top:…

[UI5 常用控件] 05.FlexBox, VBox,HBox,HorizontalLayout,VerticalLayout

文章目录 前言1. FlexBox布局控件1.1 alignItems 对齐模式1.2 justifyContent 对齐模式1.3 Direction1.4 Sort1.5 Render Type1.6 嵌套使用1.7 组件等高显示 2. HBox,VBox3. HorizontalLayout&#xff0c;VerticalLayout 前言 本章节记录常用控件FlexBox,VBox,HBox,Horizontal…

Win32 SDK Gui编程系列之--ListView自绘OwnerDraw(续)

通过所有者绘制的列表视图(2) 所有者绘制列表视图的基础已在前一页中说明。本页将展示如何在所有者绘制列表视图中显示数据库表数据。 1、访问日志 正如在另一个页面中所述,本网站的访问日志目前是通过SQLite3数据库管理的。 以下是上述程序执行的结果。为…

Linux中共享内存(mmap函数的使用)

内存映射的基本使用 内存映射 概念&#xff1a; 使一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必再调用read,write。 mmap()的优点&#xff1a; 实现了用户空间和内核空间的高效交互方式 优化前&#xff1a;优…

大数据调用链监控平台技术原理

一、AOP技术总结 二、监控逻辑动态织入原理 三、JVM动态织入流程 四、调用链监控平台技术简要总结 &#xff08;一&#xff09;、单服务的无感知自动日志埋点 jvm层面的字节码织入埋点&#xff0c;javaagent方式启动。 &#xff08;二&#xff09;、多服务调用链串联 trace…