回答
您可以使用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. 推迟执行聚集
- 4. 推迟执行PHP脚本
- 5. 推迟执行值不变
- 6. 推迟执行在哪里在sql
- 7. 在这里推迟jQuery执行吗?
- 8. 函数中的延迟承诺不推迟函数的执行
- 9. 推迟执行直到需要
- 10. 延迟执行 - C#WPF
- 11. C#的LINQ - 延迟执行
- 12. 如何推迟在龙卷风中执行python任务?
- 13. 在非WebKit浏览器中推迟JavaScript执行
- 14. 在任务并行库:如何推迟Task.TaskFactory.FromAsync任务执行?
- 15. 在延迟执行LINQ C#中的奇怪行为
- 16. 如何LINQ时推迟执行在using语句
- 17. 推迟在浏览器上的脚本和执行顺序
- 18. 推迟的<script>执行在HTML - 对用户的请求
- 19. 推迟执行node.js中的异步消息传递函数
- 20. c#推迟保存实施
- 21. 延迟执行LINQ C#TOLOWER TOUPPER的toString
- 22. C#到MY SQL延迟查询执行
- 23. 延迟在执行Segue
- 24. VB.NET中的延迟执行
- 25. 推迟代码以便以后在python中执行(像javascript中的setTimeout)
- 26. 如何在c#中延迟执行方法?
- 27. 延迟while循环在c中执行HttpRequest#
- 28. 如何在c中延迟执行一个函数#
- 29. 在Objective-C中使用延迟执行方法
- 30. 如何在C#中使用定时器时延迟执行#
但除了额外的间接层之外,“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