如何在同类方法中使用委托获取的变量及跨类返回委托获取的Int值
解决方案:从委托回调中获取并返回int值,以及跨方法使用该值
看起来你已经走对了第一步——用委托实现了类B对类A变量的访问,断点也确认值是对的,接下来就差把这个值转成int返回,以及在声明委托的类里跨方法使用它了。我给你分场景整理解决方案:
1. 在类B中把委托获取到的valueRetrieved转为int返回
如果你的委托是回调型(比如类A在变量满足条件自增后,主动通过委托把新值传给类B),那类B需要先把收到的值存起来,再提供一个方法返回这个存储的int值。给你写个完整的可运行示例:
第一步:定义类A(包含自增变量和委托)
public class ClassA { // 要监控的自增变量 private int _counter = 0; // 声明委托:用于通知外部变量更新 public delegate void CounterUpdatedHandler(int newValue); // 委托字段,保存外部注册的回调逻辑 public CounterUpdatedHandler OnCounterUpdated; public void DoWorkThatTriggersIncrement() { // 模拟"满足特定条件"的逻辑 if (DateTime.Now.Second % 2 == 0) // 替换成你的实际条件 { _counter++; // 变量更新时,触发委托通知所有注册的外部对象 OnCounterUpdated?.Invoke(_counter); } } }
第二步:在类B中接收值并返回int
类B需要先注册委托回调,把收到的valueRetrieved(也就是示例里的newValue)存到自己的成员变量里,再写一个方法返回这个值:
public class ClassB { // 存储从委托获取到的最新int值 private int _latestCounterValue; public void SubscribeToClassA(ClassA aInstance) { // 注册委托回调:收到新值时更新本地存储 aInstance.OnCounterUpdated += (newValue) => { _latestCounterValue = newValue; // 你在这里断点确认的valueRetrieved就是这个newValue }; } // 对外提供方法,返回存储的int值 public int GetLatestCounter() { return _latestCounterValue; } }
这样,当你调用classBInstance.GetLatestCounter()时,就能拿到类A里最新的自增变量值了。
2. 在声明委托的类(ClassA)的不同方法中使用委托获取的变量
其实对于ClassA自己来说,直接访问私有变量_counter是最直接高效的,完全没必要通过委托绕一圈。但如果你的业务场景确实需要通过委托来获取(比如统一对外的访问入口),也可以直接调用委托本身:
public class ClassA { // 之前的代码不变... public void SomeOtherMethodInClassA() { // 场景1:如果是回调型委托,你可以主动触发它(比如把当前值传给所有订阅者) OnCounterUpdated?.Invoke(_counter); // 场景2:如果是返回值型委托(比如让外部主动获取值),可以直接调用委托实例 // 举个返回值型委托的例子: // public delegate int GetCounterDelegate(); // GetCounterDelegate getCounter = () => _counter; // int currentValue = getCounter(); // 在这里使用currentValue做逻辑 // 最推荐的方式:直接用私有变量 int currentCounter = _counter; Console.WriteLine($"当前计数器值:{currentCounter}"); } }
如果你的委托是外部主动调用获取值的类型(不是回调),那代码会更简单,比如:
返回值型委托的简化示例
public class ClassA { private int _counter = 0; // 声明返回int的委托 public delegate int GetCurrentCounterDelegate(); // 给外部提供获取委托实例的方法 public GetCurrentCounterDelegate GetCounterAccessor() { // 返回一个匿名方法,指向获取当前_counter的逻辑 return () => _counter; } public void IncrementWhenConditionMet() { if (true) // 替换成你的实际条件 { _counter++; } } } // 类B中直接调用委托获取int值 public class ClassB { public int FetchCounterFromClassA(ClassA aInstance) { // 获取委托实例 var getCounter = aInstance.GetCounterAccessor(); // 调用委托直接返回int值 return getCounter(); } }
你可能遇到的坑
如果之前你调用方法只拿到默认值(比如0),大概率是这两个原因:
- 你没有把委托传来的值存到类B的成员变量里(只是在回调里用了一下,没保存)
- 调用返回方法时,类A的自增逻辑还没执行(委托还没触发过,所以存储的还是默认值)
可以在调用GetLatestCounter()前,先确保ClassA的自增方法已经被执行过哦。
内容的提问来源于stack exchange,提问作者Jorge Guerreiro
相关产品推荐
相关产品推荐

