如何用 func 委托替换 Action 委托,将值返回给函数

Posted

技术标签:

【中文标题】如何用 func 委托替换 Action 委托,将值返回给函数【英文标题】:How to replace Action delegate with a func delegate return a value to function 【发布时间】:2020-01-27 18:17:01 【问题描述】:

我有一个名为 CompleteDownload 的函数,它接受 int 参数,我想在这个函数中打印百分比

public void CompletedDownload(int percentage)
    
    Console.WriteLine(mID+":"+percentage+"% Loading is Completed");
 

我有一个功能:

public void LoadProcedure(int n,Action<int> inAction)
       
      // LoadingDisplay loadingDisplay=new LoadingDisplay(n);
        for(int i=0;i<=n;i++)
        
            if(i==n/4)
               

                inAction(i);


            
        
     

我想使用 func 委托将 i 值返回给 Completeddownload 函数,方法是什么

Loading loading=new Loading();
loading.LoadProcedure(100,display.CompletedDownLoad);

还帮助我主要如何指定它。

【问题讨论】:

您能否请edit 澄清为什么不能使用Func&lt;…&gt; 如何在上面的上下文中使用它先生你可以指定它 【参考方案1】:

在您的示例中,您似乎不需要对响应执行任何操作。因此,您无需尝试从 CompletedDownload 方法返回值,而是可以处理您的操作并在满足条件时简单地中断循环。

public void LoadProcedure(int n, Action<int> inAction)

    // LoadingDisplay loadingDisplay=new LoadingDisplay(n);
    for (int i = 0; i <= n; i++)
    
        if (i == n / 4)
        
            inAction(i);
            break;
        
    

这将运行您的操作,退出循环并返回调用方法。

如果您绝对需要返回触发操作的输入变量,只需将LoadProcedure 的返回类型从 void 更改为 int 并返回结果。

var result = loading.LoadProcedure(100,display.CompletedDownLoad);

public int LoadProcedure(int n, Action<int> inAction)

    // LoadingDisplay loadingDisplay=new LoadingDisplay(n);
    for (int i = 0; i <= n; i++)
    
        if (i == n / 4)
        
            inAction(i);
            return i;
        
    

无需将inAction 更改为Func&lt;&gt;,因为您目前没有在inAction 中进行任何计算。

【讨论】:

先生,对于同一个例子,我怎样才能用 func 委托替换动作委托 @Rock 您当前的示例不支持 Func 用例,但我添加了一个附加示例来返回触发回调的值。

以上是关于如何用 func 委托替换 Action 委托,将值返回给函数的主要内容,如果未能解决你的问题,请参考以下文章

C#中Func与Action的理解

如何将异步Func或Action转换为委托并调用它

委托 Action和Func

手动创建委托与使用 Action/Func 委托

委托之Action和Func区别

用委托 C# 替换 Func