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

