2009-06-29 85 views
3

最近,我已具有很多诊断日志记录在我的代码部分的模式,即利用lambda表达式/匿名委托的,像这样:是否有可能拥有太多的匿名代表?

MyEventManager.LogVerbose(LogCategory.SomeCategory,() => String.Format(msg_string, GetParam1(), GetParam2(), GetParam3()); 

注意,第二个参数LogVerbose是一个lambda表达式,其值为一个字符串。原因是如果详细日志记录实际上没有启用,LogVerbose应该退出尽可能少的工作,以便将性能影响降至最低。在某些情况下,错误消息字符串的构造可能需要时间或资源,并且如果lambda表达式从未被评估过,则不会发生性能损失。

我想知道是否抛弃类似这样的匿名代理的类型系统会对应用程序性能产生一些无法预料的后果,或者是否应该考虑其他任何策略。

回答

2

应该没问题。特别是,如果你的匿名函数没有捕获任何东西,它将被缓存为一个静态字段(因为它可以)。如果你捕获“this”,那么你最终会创建新的委托实例,但它们并不昂贵。

如果你捕获局部变量,这将涉及到实例化一个嵌套类型 - 但我只担心这个,如果你看到它实际上成为一个问题。与最优化一样,首先关注可读性,衡量性能,然后对其进行分析以找出需要集中精力的地方。

+0

这是我怀疑的,这是技术上的理由。 – jlew 2009-06-29 17:18:18

2

虽然实际上我并不确定这个问题的答案,但我认为值得考虑的是,如果有人提出某种类型的建议,那么在C#中推动更实用的编程风格将被严重破坏限制使用这些表达方式。

2

我有一个解决方案,有成千上万的匿名代表,它仍然有效。有时Visual Studio有点笨拙,但是这是因为我们有数百个项目,或者这个或其他因素未知。应用程序的性能似乎并没有受到很大的影响(通过相当多的性能测试)。

相关问题