如何从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
相关产品推荐
相关产品推荐

