我碰到它包含下面的代碼示例這個問題about dealing with DateTime.Now in unit tests的接受的答案:爲什麼將func <T>傳遞給構造函數而不是T?
private readonly Func<DateTime> _nowProvider;
public SomeClass(Func<DateTime> nowProvider)
{
_nowProvider = nowProvider;
}
public bool Foo()
{
return (_nowProvider().DayOfWeek == DayOfWeek.Sunday);
}
實例化爲例如:
var s = new SomeClass(() => DateTime.Now);
在C#中,我沒有太多的使用Func<T>
所以我想我'd看看at the Microsoft documentation for it其中有以下注釋:
你可以使用這個委託來表示一個方法,可以作爲參數傳遞而不顯式聲明自定義委託。封裝的方法必須與此代理定義的方法簽名相對應。這意味着封裝的方法必須沒有參數並且必須返回一個值。
它爲什麼會在這個例子更利於傳遞Func<DateTime>
,實例化爲Class(() => DateTime.Now)
到構造
,而不是隻是簡單的實例化Class(DateTime.Now)
來構造一個DateTime
參數傳遞相反?
根據上面提到的微軟文檔,LINQ的lambda構造函數也採取Func<T>
的論點和我的經驗證明它們非常靈活,但我不明白爲什麼?
所以這個類可以隨時調用它來獲得更新的結果。如果你剛剛通過T,價值將永遠是固定的。它還使得測試更容易,因爲您可以輕鬆_cheat_的價值爲了測試 – litelite
這可能對單元測試有意義 – ogomrub
它將允許單元測試提供測試基於時間的函數的特定時間。 –