回答
您可以使用lambda表達式/代表:
Func<string> doit =() => DoFoo();
// - or -
Func<string> doit = DoFoo;
之後你可以調用doit
就像一個方法:
string x = doit();
我認爲你可以得到最接近的是這樣的:
Lazy<string> x = DoFoo;
string y = x; // "use" x
有了類似這樣的Lazy<T>
定義(未經測試):
public class Lazy<T>
{
private readonly Func<T> func;
private bool hasValue;
private T value;
public Lazy(Func<T> func)
{
this.func = func;
this.hasValue = false;
}
public static implicit operator Lazy<T>(Func<T> func)
{
return new Lazy<T>(func);
}
public static implicit operator T(Lazy<T> lazy)
{
if (!lazy.hasValue)
{
lazy.value = lazy.func();
lazy.hasValue = true;
}
return lazy.value;
}
}
不幸的是,它似乎是編譯器的類型推理算法不能自動推斷Func<T>
的類型,所以不能將其匹配到隱式轉換運算符。我們需要顯式聲明委託的類型,這使得賦值語句更詳細:
// none of these will compile...
Lazy<string> x = DoFoo;
Lazy<string> y =() => DoFoo();
Lazy<string> z = delegate() { return DoFoo(); };
// these all work...
Lazy<string> a = (Func<string>)DoFoo;
Lazy<string> b = (Func<string>)(() => DoFoo());
Lazy<string> c = new Func<string>(DoFoo);
Lazy<string> d = new Func<string>(() => DoFoo());
Lazy<string> e = new Lazy<string>(DoFoo);
Lazy<string> f = new Lazy<string>(() => DoFoo);
爲什麼不直接調用'DoFoo()'直到你想要?
- 編輯
我的意思是,你是什麼意思「使用」
例如,如果你想讓它'的ToString()調用的時候被調用,您可以隨時繼承類並在那裏實現你的功能(但這將是非常不直觀的恕我直言)。
不是傳遞一個字符串X的,傳遞採購你的字符串
Func<String> fooFunc=()=>DoFoo();
你漂亮的委託很多描述LINQ的行動。 linq查詢描述瞭如何獲取數據,但只有在迭代查詢時纔會檢索數據(調用DoFunc)。考慮如果您可以將您的設計更改爲接受IQueryable<string>
,而您需要string
。
雖然它有點髒,你總是可以使用yield關鍵字:
public IEnumerable<int> DoFoo() {
Console.WriteLine("doing foo");
yield return 10;
}
[Test]
public void TestMethod()
{
var x = DoFoo();
Console.WriteLine("foo aquired?");
Console.WriteLine(x.First());
}
一種選擇是使用Lazy<T>
類,以前從並行擴展庫現在.Net框架4.0的一部分。
它可以讓你在一個線程知道地拖延處理數據。
我更喜歡使用系統類來這樣做。但是,系統類沒有實現隱式運算符,這促使我搜索原因。我發現[this](http://netvignettes.wordpress.com/2011/04/24/implicit-conversion-operators-are-bad/),這就解釋了原因。 – 2014-09-24 21:54:22
- 1. 在VB.NET中推遲執行?
- 2. 推遲執行
- 3. Jquery推遲執行
- 4. Linq在asp.net中推遲執行
- 5. 推遲在Firebase Cloud中執行任務
- 6. 推遲執行值不變
- 7. 推遲執行任務
- 8. 推遲執行聚集
- 9. 推遲執行PHP腳本
- 10. 推遲內嵌JavaScript執行?
- 11. 推遲執行在哪裏在sql
- 12. 推遲Twig中的執行/完成
- 13. Directory.EnumeratedDirectorties在執行前被推遲了嗎?
- 14. 在這裏推遲jQuery執行嗎?
- 15. 函數中的延遲承諾不推遲函數的執行
- 16. LINQ to SQL推遲執行和實現
- 17. 推遲執行芹菜任務
- 18. 推遲執行直到需要
- 19. jquery推遲ajax調用執行
- 20. 如何推遲Jasmine SpecRunner的執行
- 21. 推遲執行對ES6模板字面
- 22. 如何推遲Celery任務的執行?
- 23. 的Javascript只執行Deferred2,不也推遲
- 24. C#的LINQ - 延遲執行
- 25. 延遲執行 - C#WPF
- 26. 如何推遲在龍捲風中執行python任務?
- 27. 在Python中聚合和推遲函數執行
- 28. LINQ在T-SQL中推遲執行的等效代碼
- 29. 在非WebKit瀏覽器中推遲JavaScript執行
- 30. 在任務並行庫:如何推遲Task.TaskFactory.FromAsync任務執行?
但除了額外的間接層之外,「string x = doit()'」與string x = DoFoo()'「有什麼不同? – LukeH 2009-09-10 01:14:27
它不是。我沒有讀到這個問題。將在第二秒內改進答案... – dtb 2009-09-10 01:15:38
在x被「使用」之前,仍然會調用「DoFoo()」。 – 2009-09-10 01:15:58