You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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; }这种不带方法体的写法)要求getset要么都自动实现,要么都手动提供方法体。你只给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

火山引擎 最新活动