使用嵌套类/临时类保存数据

本文介绍了一种通过创建自定义类来替代嵌套pair存储复杂关联数据的方法,提高了代码的可读性和维护性。

之前为了保存关联数据,使用了嵌套pair进行存储http://blog.youkuaiyun.com/originalcandy/article/details/78486349
但若关联数据较多,多个pair嵌套可读性特别差!为解决这个问题,可以使用一个临时class或struct来保存数据,其主要区别是class成员默认private,struct成员默认public,这里以类为例。

class TempClass
{
public:
    TempClass(CATUnicodeString usID,CATUnicodeString usName,CATUnicodeString usType,double dLowDia,double dHighDia,double dThickness,CATUnicodeString usColor,int iR,int iG,int iB)
    {
        this->ID=usID;
        this->Name=usName;
        this->Type=usType;
        this->LowDia=dLowDia;
        this->HighDia=dHighDia;
        this->Thickness=dThickness;
        this->Color=usColor;
        this->ColorR=iR;
        this->ColorG=iG;
        this->ColorB=iB;
    };

    TempClass()
    {
        this->ID="";
        this->Name="";
        this->Type="";
        this->LowDia=0;
        this->HighDia=0;
        this->Thickness=0;
        this->Color="";
        this->ColorR=0;
        this->ColorG=0;
        this->ColorB=0;

    };

    ~TempClass(){};

    CATUnicodeString ID;
    CATUnicodeString Name;
    CATUnicodeString Type;
    double LowDia;
    double HighDia;
    double Thickness;
    CATUnicodeString Color;
    int ColorR;
    int ColorG;
    int ColorB;

};

可以用vector来保存所有数据:

vector<TempClass>

这样集中保存处理数据,这样处理后可读性较好,但会有些许冗余数据。若公共变量需要使用到该临时class,在头文件中声明一下即可:

class TempClass;
<think>我们正在讨论的是Unity中的嵌套类(nested classes),而不是嵌套Prefab。用户的问题集中在嵌套类是否有意义,尤其是从性能或设计角度。 根据之前的对话历史,用户已经了解到嵌套类在性能上没有直接优势,但可能有一些代码组织上的好处。现在用户进一步询问“嵌套类是否没有意义”,我们需要从设计角度和Unity特定环境来回答。 关键点: 1. 嵌套类在C#中是有意义的,它们可以增强封装性,尤其是当这个只在外部内部使用时。 2. 在Unity中,嵌套类有一些限制,例如不能作为MonoBehaviour,也不能被序列化(如果嵌套类不是Serializable的话)。 3. 但是,嵌套类在Unity中仍然有合理的使用场景,比如作为外部的辅助,仅被外部使用。 因此,我们的回答应该强调:嵌套类在Unity中是有意义的,但需要正确使用。 结构: 1. 先明确回答:嵌套类在Unity中是有意义的,但要注意使用场景。 2. 分析嵌套类的优势(封装性、代码组织)。 3. 指出在Unity中的限制(序列化、不能用于MonoBehaviour等)。 4. 给出使用建议和示例。 注意:引用[1]是关于Prefab嵌套的,与嵌套无关,因此我们忽略它,专注于嵌套。 但为了遵循指令,我们可以在适当的地方引用之前的回答(如果有的话),不过用户的问题已经脱离之前的引用内容。 由于用户的问题不涉及之前的引用内容,我们主要根据C#和Unity的常识回答。 我们将这样组织回答: - 开头:直接回答问题,嵌套类在Unity中是有意义的。 - 优势:封装性、代码组织、避免命名冲突。 - 限制:Unity序列化不支持嵌套类(除非标记为Serializable且是公有字段)、不能作为组件。 - 使用场景:内部工具、状态机、内部数据结构等。 - 示例:展示一个合理的嵌套类使用。 - 注意事项:避免滥用,特别是注意闭包和性能问题(如之前讨论的)。 同时,我们将生成相关问题。 </think> 在 Unity 中使用嵌套类**有意义**,但需结合具体场景合理使用。以下是关键分析: --- ### ✅ 嵌套类的核心价值(有意义场景) 1. **增强封装性** 当辅助**仅被一个外部使用时**,嵌套可避免污染全局命名空间: ```csharp public class InventorySystem { // 仅库系统使用的物品槽位 private class InventorySlot { public Item item; public int count; } } ``` 这种设计符合 **SOLID 原则**的单一职责[^1]。 2. **逻辑分组优化** 在状态机、构建者模式等场景中,嵌套类可提升代码可读性: ```csharp public class EnemyAI { public class PatrolState { ... } // 巡逻状态逻辑 public class ChaseState { ... } // 追逐状态逻辑 } ``` 3. **访问控制优势** 嵌套类天然访问外部私有成员,避免繁琐的 Getter/Setter: ```csharp public class NetworkManager { private string authToken; // 嵌套类直接使用外部私有字段 private class PacketHandler { public void Handle(Packet p) { if(p.Validate(authToken)) ... // 直接访问外部私有字段 } } } ``` --- ### ⚠️ Unity 中的特殊限制(需规避场景) 1. **序列化失效** Unity 序列化系统**不支持嵌套类**,导致数据无法保存: ```csharp public class Player : MonoBehaviour { [Serializable] // 错误!Unity 无法序列化嵌套类 private class SkillData { public int level; public float cooldown; } public SkillData fireball; // 编辑器不显示字段 } ``` 2. **组件化障碍** 嵌套类**不能继承 MonoBehaviour**,无法挂载为组件: ```csharp public class Enemy : MonoBehaviour { // 错误!无法挂载到GameObject private class Movement : MonoBehaviour { void Update() { ... } } } ``` 3. **ECS 架构冲突** 破坏 **Data-Oriented** 内布局,影响性能: ```csharp public class PhysicsSystem : SystemBase { // 错误:嵌套类破坏内连续性 private class CollisionPair { ... } } ``` --- ### 📊 使用决策指南 | **场景** | 是否推荐嵌套类 | 替代方案 | |------------------------|---------------|----------------------------| | 临时辅助工具 | ✅ 推荐 | - | | MonoBehaviour 组件 | ❌ 禁止 | 独立 MonoBehaviour 脚本 | | 序列化数据结构 | ❌ 禁止 | 独立 `[Serializable]` | | ECS 数据组件 | ❌ 禁止 | struct 或 IComponent 实现 | | 编辑器工具 | ✅ 推荐 | 静态嵌套类减少内占用 | --- ### 正确用法示例 ```csharp // 正确用例:非序列化的内部工具 public class Pathfinding { // 静态嵌套类避免内开销 private static class HeuristicCalculator { public static float Manhattan(Vector2 a, Vector2 b) { return Mathf.Abs(a.x - b.x) + Mathf.Abs(a.y - b.y); } } public void FindPath() { float cost = HeuristicCalculator.Manhattan(start, end); } } // 正确用例:状态机内部状态 public class PlayerController { private abstract class State { public abstract void Update(); } private class RunningState : State { ... } private class JumpingState : State { ... } } ``` --- ### 结论 Unity 嵌套类**有意义但非万能**: - ✅ **推荐用于**:内部工具、状态模式、逻辑分组等**非序列化/非组件**场景 - ❌ **禁止用于**:需序列化的数据、MonoBehaviour 组件、ECS 数据结构 - ⚠️ **重要提示**:优先使用 **静态嵌套类** 避免意外内分配[^2] > 设计原则:当A**只被B使用**且**无需独立在**时,嵌套是最佳选择 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值