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

C#面向对象代码异常:实例共享武器属性问题排查

问题原因分析及解决方案

1. Fighter类的武器属性被定义为静态(static)

如果你的Weapon字段/属性加了static修饰符,所有Fighter实例会共享同一个值,修改任意一个实例的武器,所有对象的武器都会同步变化。

错误代码示例:

public class Fighter
{
    // 静态字段,所有实例共享同一值
    public static Weapon CurrentWeapon;
    public int WeaponValue;
}

解决方法:移除static修饰符,让每个实例拥有独立的字段:

public class Fighter
{
    public Weapon CurrentWeapon;
    public int WeaponValue;
}

2. WeaponValue的映射逻辑错误

如果WeaponValue是根据枚举计算的,但逻辑写错(比如所有枚举值返回同一数值、依赖共享变量),会导致值不符合预期。

错误代码示例:

public enum Weapon { Sword, Bow }

public class Fighter
{
    public Weapon CurrentWeapon;
    public int WeaponValue;

    public Fighter(Weapon weapon)
    {
        CurrentWeapon = weapon;
        // 错误:所有武器返回固定值10
        WeaponValue = 10;
    }
}

正确的映射逻辑:针对不同枚举值返回对应数值

public class Fighter
{
    public Weapon CurrentWeapon;
    public int WeaponValue;

    public Fighter(Weapon weapon)
    {
        CurrentWeapon = weapon;
        WeaponValue = CurrentWeapon switch
        {
            Weapon.Sword => 50,
            Weapon.Bow => 30,
            _ => 0
        };
    }
}

3. 实例化时重复引用同一对象

如果两个变量指向同一个Fighter实例,而非分别实例化独立对象,属性自然完全一致。

错误代码示例:

var fighter1 = new Fighter(Weapon.Sword);
// 错误:fighter2与fighter1指向同一个对象
var fighter2 = fighter1;
fighter2.CurrentWeapon = Weapon.Bow;

解决方法:分别实例化独立对象

var fighter1 = new Fighter(Weapon.Sword);
var fighter2 = new Fighter(Weapon.Bow);

4. 枚举定义或赋值错误

如果枚举成员被设置为相同数值,或实例化时传错了枚举值,也会导致属性一致。

错误枚举定义示例:

public enum Weapon
{
    Sword = 0,
    Bow = 0 // 两个枚举值数值重复
}

错误赋值示例:

// 错误:两个对象都传入了Sword
var fighter1 = new Fighter(Weapon.Sword);
var fighter2 = new Fighter(Weapon.Sword);

解决方法:确保枚举成员值唯一,实例化时传入正确的枚举值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:23:15