2013-02-27 23 views
-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代替FUNC [X](x)的調用,並有一些difficultes(不能打電話像一個空洞的方法)。但我認爲這很簡單。任何優惠?

+0

那麼具體的錯誤是什麼,它發生在哪裏? – 2013-02-27 20:23:11

+1

你真的想達到什麼目的?目前尚不清楚。 – 2013-02-27 20:23:55

+0

@JonSkeet它看起來像他試圖計數的時候,他援引他的財產 – 2013-02-27 20:24:23

回答

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(); 
    } 
}