有太多匿名委托是否可能?

3

最近,我已经开始在代码的某些部分中使用大量诊断日志记录模式,这些记录模式使用lambda表达式/匿名委托,例如:

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

请注意,LogVerbose的第二个参数是一个lambda表达式,它将计算为一个字符串。这样做的原因是,如果未实际启用详细日志记录,则LogVerbose应该在尽可能少的工作量下退出,以最小化性能影响。在某些情况下,构建错误消息字符串可能需要时间或资源,如果永远不评估lambda表达式,则不会产生性能损失。
我想知道像这样在类型系统中添加许多匿名委托是否会对应用程序性能产生一些意想不到的后果,或者是否应考虑其他策略。
3个回答

2

虽然我并不确定这个问题的答案,但我认为值得考虑的是,在C#中转向更功能化编程风格的推动将会受到严重破坏,如果有任何关于使用此类表达式的限制的建议。


2

应该没问题。特别是,如果您的匿名函数不捕获任何东西,则会将其缓存为静态字段(因为可以这样做)。如果您捕获了"this",那么您将最终创建新的委托实例,但它们并不昂贵。

如果您捕获局部变量,则会涉及实例化嵌套类型-但是只有在您看到它实际上成为问题时才需要担心此问题。与优化一样,首先注重可读性,测量性能,然后对其进行分析,以找出需要集中精力的地方。


这正是我所怀疑的,这是为了技术上的证明。 - jlew

2

我有一个解决方案,其中包含成千上万个匿名委托,并且仍然有效。有时候Visual Studio可能会有些笨重,但是这可能是因为我们有数百个项目或其他因素造成的,具体原因不得而知。经过相当多的性能测试,应用程序的性能似乎并没有受到太大影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接