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

为何无法调用类的实例变量?附相关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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:06:35