如果有的话,通过诊断传递序列化数据的危险是什么?

时间:2016-01-10 16:24:33

标签: c# roslyn

创建诊断允许您使用自定义数据传递Dictionary<string, string>。之后,您可以在读取诊断的任何内容中使用它来提供上下文信息。典型的情况是分析器和代码修复之间可用。

这种传递数据的方法有多可靠?是否应该记住哪些特殊注意事项?

我回忆起几个月前关于这个问题的讨论,当时提出关于可串行化的问题是不提供这种功能的一个原因。我想到的其他事情是竞争条件的可能性(代码修复程序根据分析仪过时的信息),但我在质疑它的可能性(或者它是否可能)。更改语法树时应取消诊断,但我不知道这是否传播到代码修复。

提供a specific example:我正在做一些技巧来发现两件事:参数名称和位置。在分析器中,此位置用于显示波浪线下划线,而参数用于创建新调用。 我不是两次计算参数名称和位置,而是通过properties参数传递,然后使用分析器中确定的位置从代码修复中检索受影响的节点。

1 个答案:

答案 0 :(得分:2)

只要系统中存在诊断,就会维护属性。所以你可以依赖你从分析仪中输入的数据。

但话虽如此,如果可能,避免使用属性包对用户来说会更好。

这些预先计算的诊断是在没有用户交互的情况下生成的,并且保存在系统中以用于整个解决方案,因此每个诊断的那些少量额外信息会加起来。 (基本上消耗资源)

与诊断相比,修复程序仅在有明确的用户操作且仅运行少量修复程序时运行(通常适用于插入符号的行)

所以将一些数据放在诊断中只是为了让修复程序更快一些(如果加速很快,那么你可能有理由)就像在每次系统重启时加载控制面板以加快第一次启动时间以防你可能使用关机前控制面板。