如何使用方法调用作为参数

麦克风

在C#中,如何通过将一个方法作为另一个方法的参数来传递方法,方法是将参数传递给被调用的方法,以便在内部调用该方法,例如,以测量其执行为目标?

该代码可以接近以下伪代码吗?

public TR MeasureExecutionTime<T1, T2, T3, T4, T5, T6, TR>(this Func<T1, T2, T3, T4, T5, T6, TR> func, out long executionTime)
{
    Stopwatch stopwatch = Stopwatch.StartNew();

    TR tr = func();

    stopwatch.Stop();

    executionTime = stopwatch.ElapsedMilliseconds;

    return tr;
}

...

var result = MeasureExecutionTime(() => obj.Process(p1, p2, p3, p4, p5, p6), out long executionTime);

这里的主要问题似乎是如何传递和推导被调用者参数p1,p2,p3,p4,p5,p6。如何写得尽可能灵活和简单?

马修·沃森

您可以在创建要计时的lambda时应用参数,而不是在进行计时的方法中应用参数。

因此,您可以像这样实现计时功能(使用元组返回两个值):

public static (TimeSpan duration, T result) TimeFunction<T>(Func<T> func)
{
    var sw = Stopwatch.StartNew();
    var result = func();
    return (sw.Elapsed, result);
}

您可以使用它来计时具有多个参数的函数,如下所示:

using System;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main()
        {
            // Note how we apply the parameters here, even though the 
            // function is actually called inside TimeFunction().

            var result = TimeFunction(() => functionToTime(1, 2.0, "3"));

            Console.WriteLine("Result = "   + result.value);
            Console.WriteLine("Duration = " + result.duration);
        }

        static string functionToTime(int intVal, double doubleVal, string stringVal)
        {
            Thread.Sleep(250);
            return $"intVal = {intVal}, doubleVal = {doubleVal}, stringVal = {stringVal}";
        }

        public static (TimeSpan duration, T value) TimeFunction<T>(Func<T> func)
        {
            var sw = Stopwatch.StartNew();
            var result = func();
            return (sw.Elapsed, result);
        }
    }
}

这种方法类似于本文中讨论的“部分函数应用程序”

注意:如果由于使用的是C#的较旧版本而无法使用元组,则必须声明计时方法,如下所示:

public static T TimeFunction<T>(Func<T> func, out TimeSpan duration)
{
    var sw = Stopwatch.StartNew();
    var result = func();
    duration = sw.Elapsed;

    return result;
}

并相应地更改对其的调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何调用作为Java的参数传递的功能?

规划环境地政司如何使用方法调用的参数?

如何在Java中使用方法引用符号(Class :: method)将方法作为参数传递?

如何调用作为参数接收的C函数

如何使用Func类型的Expression作为参数调用方法

函数调用作为默认函数参数

部分函数调用作为参数python

如何调用作为参数给定的C ++类方法?

PHP Send方法调用作为方法的参数

如何使用Object ...作为参数调用方法

使用方法作为部分命令的参数

将字段作为参数传递与将方法调用作为参数传递有何不同?

使用函数调用作为默认参数javascript

如何使用方法参数访问对象?

如何使用作为参数传递给方法的类类型来定义局部变量

Malloc调用作为函数参数

C ++使用方法作为函数的参数

如何使用方法名称作为字符串来调用方法

使用方法返回值作为参数与在一种方法中设置类变量并将其用作另一种方法的参数

ABAP使用方法作为参数

使用方法参数作为链接关系的占位符

如何使用方法名称作为参数

如何在Scala中调用作为参数传递的列表

如何使用方法引用作为未来的回调?

如何调用作为参数键和每个数组项传递的方法(array.length 次)?

Kotlin 如何调用作为参数传递的方法

正确使用函数调用作为默认参数

如何在ruby中使用方法参数作为变量

调用作为参数传递的类方法