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

如何存储方法的out参数值?PizzaLover类属性调用问题

嘿,我来帮你搞定这两个C#的问题,都是关于out参数的存储和访问的,很常见的场景!

问题1:存储TrySomething()的out参数值

首先,get_Property()其实就是属性get访问器的底层实现(你平时写public X MyProperty { get { ... } }时,编译器会自动生成这个方法)。要存储TrySomething()的out参数值,核心是不能用局部变量——因为每次访问属性,局部变量都会被重新创建并销毁,没法持久化或被外部访问。

你需要在类里定义一个私有字段来缓存这个out值,每次调用TrySomething()时更新这个字段,之后要么在类内部直接使用这个字段,要么提供一个额外的属性把它暴露给外部。

举个具体的实现例子:

public class YourClass
{
    // 私有字段,类型要和TrySomething的out参数匹配
    private int _trySomethingOutValue;

    public string YourProperty
    {
        get
        {
            // 调用TrySomething,把out值直接赋值给私有字段
            bool success = TrySomething(out _trySomethingOutValue);
            
            // 这里继续你的原有逻辑,比如返回对应结果
            return success ? "操作成功" : "操作失败";
        }
    }

    // 可选:如果外部需要获取这个out值,添加一个只读属性
    public int LastTrySomethingOutValue => _trySomethingOutValue;

    // 假设TrySomething的定义是这样的
    private bool TrySomething(out int result)
    {
        // 示例逻辑:生成一个随机数作为out返回值
        result = new Random().Next(100);
        return true;
    }
}

这样每次访问YourProperty时,_trySomethingOutValue都会被更新为最新的out值,你可以通过LastTrySomethingOutValue随时获取它。

问题2:获取CanAffordPizzas属性调用时的numAffordablePizzas值

你现在的写法无效,问题出在:out uint numAffordablePizzas是属性表达式里的局部变量,它的作用域只在那一行代码内,属性访问结束后这个变量就被销毁了,外部根本拿不到它的值。

解决思路和问题1一致:用类的私有字段存储这个out值,再提供一个额外的属性暴露它。这里有两种写法,看你偏好哪种:

写法1:改成块体get访问器(更直观)

public class PizzaLover
{
    private uint _numDollarsInBankAccount;
    // 新增私有字段,用来存储每次调用的out值
    private uint _lastNumAffordablePizzas;

    public bool CanAffordPizzas
    {
        get
        {
            // 把out参数直接赋值给私有字段
            bool canAfford = TryBuyPizzas(_numDollarsInBankAccount, out _lastNumAffordablePizzas);
            return canAfford;
        }
    }

    // 提供只读属性,让外部能拿到最新的可购买披萨数量
    public uint LastNumAffordablePizzas => _lastNumAffordablePizzas;

    // 假设TryBuyPizzas的实现逻辑
    private bool TryBuyPizzas(uint dollars, out uint numPizzas)
    {
        numPizzas = dollars / 5; // 假设每个披萨5美元
        return numPizzas > 0;
    }
}

写法2:保持表达式体属性(更简洁)

如果不想改成块体,也可以直接把out参数绑定到私有字段上,表达式体依然成立:

public class PizzaLover
{
    private uint _numDollarsInBankAccount;
    private uint _lastNumAffordablePizzas;

    // 表达式体直接将out值赋值给字段
    public bool CanAffordPizzas => TryBuyPizzas(_numDollarsInBankAccount, out _lastNumAffordablePizzas);

    public uint LastNumAffordablePizzas => _lastNumAffordablePizzas;

    private bool TryBuyPizzas(uint dollars, out uint numPizzas)
    {
        numPizzas = dollars / 5;
        return numPizzas > 0;
    }
}

现在你只要先访问CanAffordPizzas,再通过LastNumAffordablePizzas就能拿到对应的披萨数量了!比如:

var pizzaLover = new PizzaLover();
pizzaLover._numDollarsInBankAccount = 25; // 可以通过构造函数或公共方法设置这个私有字段
bool canAfford = pizzaLover.CanAffordPizzas;
uint howMany = pizzaLover.LastNumAffordablePizzas; // 这里会得到5

内容的提问来源于stack exchange,提问作者M.Y. Babt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:46