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

如何在同类方法中使用委托获取的变量及跨类返回委托获取的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:52:07