如何避免或检测C#中的隐式委托推理?
我正在使用C#编写一个游戏,并发现了一些情况,其中函数接受委托,我无意中传入了函数名,而不是创建和缓存一个委托以用作参数。这会导致为这些函数的每次调用创建一个委托对象,当函数返回时,委托对象立即变成垃圾 我希望找到我犯了这个错误的所有地方,并且我更希望避免阅读每个文件的每一行来寻找它们(有很多年的代码)。我看到VB有一个“option strict”,它将禁用对象的隐式构造,我认为如果C#有这个功能,它会对我起作用,但我认为它不会。我还回顾了编译器警告选项,它们在这里似乎都没有帮助如何避免或检测C#中的隐式委托推理?,c#,delegates,implicit,garbage,C#,Delegates,Implicit,Garbage,我正在使用C#编写一个游戏,并发现了一些情况,其中函数接受委托,我无意中传入了函数名,而不是创建和缓存一个委托以用作参数。这会导致为这些函数的每次调用创建一个委托对象,当函数返回时,委托对象立即变成垃圾 我希望找到我犯了这个错误的所有地方,并且我更希望避免阅读每个文件的每一行来寻找它们(有很多年的代码)。我看到VB有一个“option strict”,它将禁用对象的隐式构造,我认为如果C#有这个功能,它会对我起作用,但我认为它不会。我还回顾了编译器警告选项,它们在这里似乎都没有帮助 是否有任何合
是否有任何合理方便的方法来识别这些由隐式委托推理创建的对象,以便我可以找到需要在何处创建/缓存回调以避免垃圾?简而言之,您的问题是“如何找到所有方法组转换?” 我们目前正在开发一个名为Roslyn的项目,它将允许您使用C#编译器和IDE使用的相同语义分析引擎。它将公开语言的语法模型,然后提供一个语义分析API,您可以通过该API向语义分析器提问 使用Roslyn,您可以将所有代码编译成语法树,然后在这些语法树中搜索每个表达式。将有一个API,允许您确定表达式是否被转换为任何内容,如果是,转换分析器如何对转换进行分类 我们目前处于“社区技术预览”阶段;我们已经有了一个初步的实现,但它还远没有完全实现。我不记得方法组转换分析器是否在CTP版本中实现 试一试,如果你对此有反馈,我们很乐意在Roslyn论坛上听听你的想法 详情如下:
您是否可以提供一些代码示例,例如,Visual Studio正则表达式搜索可能会在其中找到它们?我看到的唯一方法是找到接受委托的方法/函数,然后右键单击->查找引用(尽管这涉及手动检查每个调用)。您是否有证据表明这确实导致了问题?我希望在绝大多数情况下,与使用方法组转换而不是显式缓存的可读性优势相比,性能的下降可以忽略不计。@JonSkeet:我同意你的观点Jon,但我注意到游戏是一个特例。众所周知,XBOX版CLR中的垃圾收集器对垃圾创建非常敏感,因此游戏开发人员通常必须在游戏循环中查找并消除所有垃圾创建源。@Jon Skeet-是的,我第一次注意到这一点是在进行内存分析时,一些物理代码中的高频函数在一帧中创建了数千个这样的函数,最终负责生成足够的对象,以每5秒左右触发一次GC,这对帧率有不可接受的影响。谢谢,我一直在期待Roslyn项目,原因有很多,我会把它添加到清单中,等我有时间的时候再检查一下。