-1

質問は単純です:コードを呼び出すためにそれをできるだけ単純にする方法は?私のコードは少しばかげていますが、どうしようもありません。

using System;

namespace ConsoleApplication48
{
class FunctionWithCounter<T, TResult>
{
    private readonly Func<T, TResult> function;
    public int Calls { get; private set; }

    private FunctionWithCounter(Func<T, TResult> function)
    {
        Calls = 0;
        this.function = function;
    }

    public static implicit operator FunctionWithCounter<T, TResult>(Func<T, TResult> func)
    {
        return new FunctionWithCounter<T, TResult>(func);
    }

    public TResult this[T arg]
    {
        get
        {
            Calls++;
            return function(arg);
        }
    }
}

class Program
{
    static void Main()
    {
        FunctionWithCounter<double, double> func = (Func<double, double>)(x => x*x);
        for (int i = 0; i < 5; i++)
        {
            double d = func[i];
        }
        Console.WriteLine(func.Calls);
        Console.ReadKey();
    }
}
}

したがって、私はインデクサーを使用して、func(x)の代わりにこのfunc [x]のように呼び出しますが、いくつかの困難があります(voidメソッドのように呼び出すことはできません)。しかし、それは私が思うに最も簡単です。何かオファーはありますか?

4

1 に答える 1

1

1行追加するだけで、少なくとも通常の関数構文に戻すことができます。また、暗黙のコンストラクターを削除します。実際には何も節約できません。それがないと、構文がより単純に見えます。

class FunctionWithCounter<T, TResult>
{
    public readonly Func<T, TResult> Function;
    public int Calls { get; private set; }

    public FunctionWithCounter(Func<T, TResult> function)
    {
        Calls = 0;
        Function = x =>
            {
                Calls++;
                return function(x);
            };
    }        
}

internal class Program
{
    private static void Main(string[] args)
    {
        var callCounter = new FunctionWithCounter<double,double>(x => x * x);
        var func = callCounter.Function;

        for (int i = 0; i < 5; i++)
        {
            double d = func(i);
        }
        Console.WriteLine(callCounter.Calls);
        Console.ReadKey();
    }
}
于 2013-02-27T20:50:39.540 に答える