You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从C#值类型结构体返回私有int的引用?

可行实现方案

针对你在值类型结构体中访问私有字段、重构方法及实现运算符重载的需求,以下是两种高效且符合封装原则的方案,均适配Unity高频调用场景:

方案一:内部私有ref方法(直接返回字段引用)

C# 7.0及以上版本允许结构体的非readonly成员方法返回内部私有字段的引用,结合值类型的拷贝特性即可实现需求:

public struct someStruct
{
    public enum Type { AA = 0, BB = 1, CC = 1 }
    int a;
    int b;
    int c;

    public int GetTypeStrength(Type type)
    {
        return Get(type);
    }

    // 私有方法返回内部字段的引用,注意不能标记为readonly
    private ref int Get(Type type)
    {
        return type switch
        {
            Type.AA => ref a,
            Type.BB => ref b,
            Type.CC => ref c,
            _ => throw new ArgumentOutOfRangeException(nameof(type))
        };
    }

    // 实现运算符重载:操作值拷贝实例后返回新实例,符合值类型语义
    public static someStruct operator +(someStruct sstr, Type type)
    {
        ref int targetField = ref sstr.Get(type);
        targetField++;
        return sstr;
    }

    // 可选:如需外部直接修改字段,可提供公共ref方法(仍保持字段私有)
    public ref int GetFieldRef(Type type)
    {
        return Get(type);
    }
}

说明

  • 结构体内部返回私有字段的ref完全合法,且无性能损耗,适合Unity每帧调用的场景。
  • 运算符重载中操作的是传入结构体的拷贝实例,修改后返回新实例,严格遵循值类型的不可变语义。

方案二:索引器封装(更符合C#惯用语法)

如果不想暴露ref的概念,可通过索引器封装字段的读写逻辑,既保证封装性,又能简化扩展:

public struct someStruct
{
    public enum Type { AA = 0, BB = 1, CC = 1 }
    int a;
    int b;
    int c;

    // 索引器封装字段的读写
    public int this[Type type]
    {
        get
        {
            return type switch
            {
                Type.AA => a,
                Type.BB => b,
                Type.CC => c,
                _ => throw new ArgumentOutOfRangeException(nameof(type))
            };
        }
        set
        {
            switch (type)
            {
                case Type.AA: a = value; break;
                case Type.BB: b = value; break;
                case Type.CC: c = value; break;
                default: throw new ArgumentOutOfRangeException(nameof(type));
            }
        }
    }

    public int GetTypeStrength(Type type)
    {
        return this[type];
    }

    public static someStruct operator +(someStruct sstr, Type type)
    {
        sstr[type]++;
        return sstr;
    }
}

说明

  • 索引器的方式更直观,外部调用时可直接通过structInstance[Type.AA]读写字段,无需关注内部实现。
  • 同样无额外性能开销,完全满足Unity高频调用的性能要求,且字段始终保持私有,不会破坏封装。

内容的提问来源于stack exchange,提问作者Mtreitor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:44:49