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

C#新手求助:如何修改另一个类中的变量?

搞定C#跨类修改余额变量的问题

嘿,作为C#新手碰到跨类访问变量的问题太正常啦,我来一步步给你捋清楚怎么弄~

第一步:正确设计存储余额的类

你原来写的private class Balance有个小问题:private修饰的类只能在它所在的父类内部访问,其他类根本看不到它!所以首先得调整类的访问级别,同时做好封装(这是C#的核心好习惯哦):

// 改成public(如果是同一个项目内使用,也可以用internal)
public class BalanceManager
{
    // 用私有字段存实际余额,避免外部直接修改
    private decimal _currentBalance;

    // 公开属性,方便外部读取/修改(也可以拆分get和set加权限)
    public decimal CurrentBalance
    {
        get => _currentBalance;
        set => _currentBalance = value;
    }

    // 更推荐:写专门的方法处理余额变动,能加验证逻辑
    public void Deposit(decimal amount)
    {
        if (amount <= 0)
            throw new ArgumentException("充值金额必须大于0!");
        
        _currentBalance += amount;
    }

    public void Withdraw(decimal amount)
    {
        if (amount <= 0)
            throw new ArgumentException("扣款金额必须大于0!");
        if (_currentBalance < amount)
            throw new InvalidOperationException("余额不足!");
        
        _currentBalance -= amount;
    }
}

第二步:在另一个类里修改余额

有两种常用的方式,根据你的场景选:

方式1:创建类的实例访问

如果每个用户(或场景)都需要独立的余额实例,就直接new一个对象:

public class UserService
{
    public void HandleUserDeposit()
    {
        // 创建BalanceManager实例
        var balanceManager = new BalanceManager();
        
        // 方式A:直接修改属性
        balanceManager.CurrentBalance += 200;
        
        // 方式B:用封装好的方法(更安全)
        balanceManager.Deposit(200);
    }
}

方式2:用单例模式(全局唯一余额)

如果整个程序里只有一个用户余额(比如单用户系统),可以用单例确保全局只有一个实例:

public class BalanceManager
{
    // 静态实例,全局唯一
    private static readonly BalanceManager _instance = new BalanceManager();
    
    // 私有构造函数,禁止外部new实例
    private BalanceManager() { }
    
    // 公开静态属性获取实例
    public static BalanceManager Instance => _instance;

    private decimal _currentBalance;
    public decimal CurrentBalance
    {
        get => _currentBalance;
        set => _currentBalance = value;
    }

    public void Deposit(decimal amount)
    {
        if (amount > 0)
            _currentBalance += amount;
    }
}

然后在其他类里这样用:

public class PaymentService
{
    public void ProcessPayment()
    {
        // 通过单例实例操作余额
        BalanceManager.Instance.Withdraw(150);
        // 或者直接改属性
        // BalanceManager.Instance.CurrentBalance -= 150;
    }
}

关键提醒

  • 尽量不要把余额变量直接设为public,没有封装的话,其他类可能会乱改数值,很容易出bug;
  • 如果是多线程场景(比如并发充值/扣款),还要加线程安全处理(比如用lock),不过新手可以先搞定基础场景~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:58:23