Unity中C#属性Getter/Setter默认值设置及报错问题求助
解决C#属性Getter/Setter的栈溢出与编译错误
嘿,我来帮你搞定这个Unity里的属性问题!你遇到的两个错误都是C#属性使用时的典型坑,咱们一步步拆解解决:
第一个错误:StackOverflowException
你最初的代码里犯了一个经典的递归调用问题:
public bool spin { get { return this.spin; } set { if (value == false) this.spinBack = true; this.spin = value; } }
当你访问this.spin的时候,其实是在调用这个属性的get方法,而get方法里又返回this.spin,这就形成了无限递归,不断调用自己直到栈溢出。同理,set里给this.spin赋值时,又会触发set方法,同样陷入递归死循环。
第二个错误:编译错误“'spin.get' must have a body...”
你修改后的代码写成了:
public bool spin { get; set { if (value == false) this.spinBack = true; this.spin = value; } }
C#的自动属性(就是{ get; set; }这种不带方法体的写法)要求get和set要么都自动实现,要么都手动提供方法体。你只给set写了自定义逻辑,get却留空,编译器就会报错——它不知道get该返回什么值,而且你也没把它标记为抽象、外部或部分方法。
正确的解决方案
要实现“设置默认值+自定义Setter逻辑”,你需要用私有后备字段来存储属性的实际值,让Getter和Setter操作这个字段,而不是属性本身:
// 私有后备字段,用来存储spin的实际值,这里直接设置你需要的默认值 private bool _spin = false; // 示例默认值为false,可根据需求修改 private bool spinBack; public bool Spin { get { return _spin; // 返回后备字段的值,不会触发递归 } set { // 执行你的自定义操作 if (value == false) { spinBack = true; } // 给后备字段赋值,而非属性本身 _spin = value; } }
补充:更简洁的写法(C# 6+支持)
如果你的Unity环境支持C# 6及以上版本,可以用表达式体让代码更简洁:
private bool _spin = false; private bool spinBack; public bool Spin { get => _spin; set { if (!value) spinBack = true; _spin = value; } }
这样既解决了栈溢出的问题,又满足了编译器对Getter的要求,同时完美实现了你的需求:给属性设置默认值,并且在Setter里执行自定义逻辑。
内容的提问来源于stack exchange,提问作者user1105430




