为何无法调用类的实例变量?附相关C#代码片段
问题:为何无法调用类的实例变量?
先看你提供的C#代码片段:
public class Player { private string Name; private int Health = 100; private int Damage; public Player(string name, int health, int damage) { name = Name; health = Health; damage = Damage; } } public class Enemy { public void enemyTakeDamage() { int takenDamage; } private string Name; private int Health = 100; private int Damage; public string enemyMessages; public Enemy(string name, int health, int damage) { name = Name; health = Health; damage = Damage; } } class Program { static void Main(string[] args) { // 尝试调用实例变量会失败 } }
嘿,我来帮你排查下核心问题:
1. 构造函数赋值完全搞反了!
你现在在构造函数里写的是name = Name,这是把类的实例变量Name的默认值(比如string类型默认是null)赋给了参数name,完全搞反了赋值方向!正确的写法应该是把传入的参数值赋值给类的实例变量,也就是:
public Player(string name, int health, int damage) { Name = name; Health = health; Damage = damage; }
如果不改这个,你的实例变量永远是默认值(比如Name为null,Health是你初始化的100,Damage是0),根本没用到你传入的参数,后续调用自然拿不到正确的值。
2. private修饰的变量外部无法访问
你把Name、Health、Damage都声明成了private,C#里private成员只能在当前类内部使用,外部类(比如Program或者Enemy)根本没法直接调用这些变量。如果要在外部访问,你有几个常用方案:
- 直接把修饰符改成
public(最简单但不推荐,破坏类的封装性) - 给变量添加公共属性(推荐做法,能控制读写权限):
public string Name { get; private set; } // 外部只能读,内部可以修改 public int Health { get; set; } // 外部既可以读也可以修改 public int Damage { get; private set; } - 提供专门的方法来操作这些变量,比如写一个
public void TakeDamage(int damage)来减少生命值,或者public int GetHealth()来获取当前生命值。
修正后的示例代码
这里给你改好一个Player类的例子,你可以参考着改Enemy类:
public class Player { // 用公共属性封装私有字段,或者直接用自动属性 public string Name { get; private set; } public int Health { get; set; } public int Damage { get; private set; } public Player(string name, int health, int damage) { // 正确的赋值顺序 Name = name; Health = health; Damage = damage; } // 额外加一个方法演示内部访问成员 public void TakeDamage(int damage) { Health -= damage; Console.WriteLine($"{Name} 受到了 {damage} 点伤害,当前生命值:{Health}"); } } class Program { static void Main(string[] args) { Player player = new Player("Zach", 100, 15); // 外部可以正常访问公共属性 Console.WriteLine($"玩家名称:{player.Name}"); Console.WriteLine($"初始生命值:{player.Health}"); // 调用方法修改生命值 player.TakeDamage(20); } }
这样你就能正常调用类的实例相关成员啦!
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

