6

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

我想找到我犯了这个错误的所有地方,并且我宁愿避免阅读每个文件的每一行来寻找它们(有很多年的代码)。我看到 VB 有一个“选项严格”,它将禁用对象的隐式构造,如果 C# 具有该功能,我认为这对我有用,但我不认为它有。我还查看了编译器警告选项,但它们似乎也无济于事。

是否有任何相当方便的方法来识别隐式委托推断创建的这些对象,以便我可以找出我需要在哪里创建/缓存回调以避免垃圾?

4

1 回答 1

10

简而言之,您的问题是“我怎样才能找到所有方法组转换?”

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

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

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

试一试,如果您对此有任何反馈,我们很乐意在 Roslyn 论坛上听到您的想法。

详情在这里:

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

于 2012-04-25T18:27:23.160 回答