如何在C#中避免或检测隐式委托推理?

时间:2012-04-25 18:18:41

标签: c# delegates implicit garbage

我正在使用C#编写一个游戏,并且发现了一些函数接受委托的情况,我无意中传入了一个函数名,而不是创建和缓存一个委托用作参数。这会导致为每次调用这些函数创建一个委托对象,然后在函数返回时立即变为垃圾。

我想找到我犯了这个错误的所有地方,我宁愿避免阅读每个文件的每一行寻找它们(有多年的代码值)。我看到VB有一个'选项严格'会禁用隐式构造的对象,如果C#有这个功能,我觉得这对我有用,但我认为不行。我还查看了编译器警告选项,它们似乎都没有帮助。

是否有任何合理方便的方法来识别由隐式委托推理创建的这些对象,这样我就可以找到我需要创建/缓存回调以避免垃圾的位置?

1 个答案:

答案 0 :(得分:10)

简而言之,您的问题是“如何找到所有方法组转换?”

我们目前正在开发一个代号为 Roslyn 的项目,它允许您使用C#编译器和IDE使用的相同语义分析引擎。它将公开语言的语法模型,然后提供语义分析API ,通过它您可以提出语义分析器的问题。

使用Roslyn,您可以将所有代码编译成语法树,然后搜索每个表达式的语法树。将有一个API,允许您确定表达式是否转换为任何内容,如果是,转换分析器如何对转换进行分类。

我们目前处于“社区技术预览”阶段;我们有一个初步的实施,但它还没有完全功能。我不记得方法组转换分析器是否在CTP版本中实现。

尝试一下,如果您对此有任何反馈意见,我们很乐意听取您对罗斯林论坛的看法。

详细信息:

http://msdn.microsoft.com/en-us/roslyn