如何存储方法的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
相关产品推荐
相关产品推荐

