5

このコードは、パラメーターなしで単一の関数を受け取り、そのランタイムを返します。

public static Stopwatch With_StopWatch(Action action)
{
    var stopwatch = Stopwatch.StartNew();
    action();
    stopwatch.Stop();
    return stopwatch;
}

パラメータを使用して無効でない関数を取るように変換したいと思います。Func<> デリゲートについて聞いたことがありますが、使い方がわかりません。そして、私はこのようなものが必要です(非常に疑似):

   public T measureThis(ref Stopwatch sw, TheFunctionToMeasure(parameterA,parameterB))
   {
       sw.Start(); // start stopwatch
       T returnVal = TheFunctionToMeasure(A,B); // call the func with the parameters
       stopwatch.Stop(); // stop sw
       return returnVal; // return my func's return val
   }

したがって、渡された関数の戻り値を取得し、最後にストップウォッチを取得する必要があります。 どんな助けでも大歓迎です!

4

1 に答える 1

9

元のコードは引き続き機能します。人々がそれをどのように呼ぶかは、パラメータがあると変わるものです:

With_Stopwatch(MethodWithoutParameter);
With_Stopwatch(() => MethodWithParameters(param1, param2));

2 番目の構文でパラメーターを指定してメソッドを呼び出すこともできます。

With_Stopwatch(() => MethodWithoutParameter());
With_Stopwatch(() => MethodWithParameters(param1, param2));

更新: 戻り値が必要な場合は、関数をアクションmeasureThisの代わりに取るように変更できます。Func<T>

public T measureThis<T>(Stopwatch sw, Func<T> funcToMeasure)
{
    sw.Start();
    T returnVal = funcToMeasure();
    sw.Stop();
    return returnVal;
}

Stopwatch sw = new Stopwatch();
int result = measureThis(sw, () => FunctionWithoutParameters());
Console.WriteLine("Elapsed: {0}, result: {1}", sw.Elapsed, result);
double result2 = meashreThis(sw, () => FuncWithParams(11, 22));
Console.WriteLine("Elapsed: {0}, result: {1}", sw.Elapsed, result);
于 2012-05-18T00:29:51.077 に答える