有谁知道C#的高级差异工具?

时间:2009-07-21 19:24:44

标签: c# .net asp.net visual-studio diff

我正在寻找一个可以分析我的代码的diff工具,并告诉我构造基础上构造的变化。

例如,如果我从文件的开头剪切并粘贴一个方法并将其放在最后,但保持该方法不变,我不希望它被标记。但是,如果我在该方法中插入一行代码或更改某些内容,则会将其标记为已更改。

我已经使用了各种各样的差异工具,但是他们似乎都没有告诉你插入,删除或更改了行,但却无法以任何逻辑方式分辨出这些变化。如果当我定期重新排列我的代码文件的布局时,差异工具可以跟上,那将是很好的。

有没有人有这样的工具?

12 个答案:

答案 0 :(得分:22)

我使用http://winmerge.org/

由于longest common subsequence算法适用于这些工具的方式,我认为你不能按照自己的要求行事。

即使您的功能被重新排列,并且源文件的功能保持不变,由于LCS的性质,它仍会显示为差异。

编辑:
这有点牵强,但如果你感觉更加雄心勃勃,你可以根据自己的需要编写自己的裁缝。

您可以使用正则表达式来提取源文件中的每个方法,并根据每个方法的名称单独对每个方法执行LCS diff。您可以将代码存储为Dictionary(键,值),以便键是方法的名称,值是函数的字符串。然后你只需用你的dictionary_new ['method']来区分你的dictionary_orig ['method']。

除此之外,我不知道你是如何完成你想要的。

答案 1 :(得分:9)

查看我们的Smart Differencer工具,该工具会比较抽象语法树, 并报告非终端方面的差异(“语言结构”) AST表示,以及合理的编辑操作(插入,删除,移动),以及发现一致的重命名。

目前,它只处理Java和COBOL,但它基于DMS,它 为各种语言提供解析器,包括C#。

编辑9/8/2009:C#SmartDifferencer现在可供Beta测试人员使用。

该工具已经在整个文件中处理一致的重命名 语义上微不足道(假设其他文件引用 相应地重命名的符号),以及在范围内重命名。 我们计划考虑语义上的微不足道的变化,例如 在Java和C#的类中移动方法声明。

2010年10月编辑:可用的制作版本。 Eval downloads accessible at the website.

2012年5月编辑:您可以see a C# example at this page.

目前没有做的一件事是忽略语义空编辑。一个特殊的例子就是在课堂体内改变方法;我们都知道这对C#的语义没有影响。我们的工具比较语法(通过AST),而不是语义,因此它不理解这种特殊的细微差别,因此会告诉用户“这已被移动”而不是沉默。我们计划在将来的某个时候处理这​​样的情况,但是,嘿,每个产品都必须有一个版本1: - } [作为一个微妙的点,Java类中的shuffling方法在语义上也是null,但是改组字段不是由于初始化程序的评估顺序。我不知道C#是否也是如此,但我不会感到惊讶。]

答案 2 :(得分:6)

您是否愿意在编译的程序集上进行比较?如果是这样,.NET Reflector有一个名为Diff的加载项,可用于比较2个程序集。这肯定不关心对象在源文件中的排列位置/方式。

答案 3 :(得分:3)

此工具的名称是CodeCompare。试一试 - CodeCompare。必需的功能称为structure comparison

答案 4 :(得分:2)

这也是我一直想知道的事情。我认为它还没有存在。有“功能”(而不仅仅是基于文本的)差异工具可用于其他场景。例如。 Microsoft Word集成了它自己的差异/合并功能(可以编写脚本,因此可以与TortoiseSVN集成),还有一些可用于XML的工具可以解释xml文件,而不是简单地将它们视为文本。

我不确定这样一个工具相对于一个好的基于文本的差异/合并工具的附加值是否足够引人注目地开发它。 OTOH这可能只是解决我们在面对困难的合并情况时所感受到的“合并痛苦”的缺失环节。

当然,您必须以与C#编译器相同的方式解释代码。我认为现在最接近的工具确实是NDepend。 This blog post解释了它在这方面的一些能力。

答案 5 :(得分:2)

超越Scooter Software岩石的比较,它也很便宜(30美元)。

答案 6 :(得分:2)

我发现SemanticMerge非常有帮助。它以一种很好的可视方式显示差异,并且可以轻松地比较复杂的C#代码。

答案 7 :(得分:1)

我知道你正在寻找一种工具。但既然我不知道,我就是这样做的:

  1. 阅读有关编译器设计的书
  2. Lex /解析你的代码
  3. 创建抽象语法树
  4. 创建用于在语法树上执行差异的算法
  5. 利润!

答案 8 :(得分:0)

我使用KDiff并发现它运作良好。当然是免费的。

答案 9 :(得分:0)

正如许多人所建议的那样,我猜这种比较是不可能使用可用的diff工具。因为他们的目的是说某些事情是否发生了变化,如果你从一开始就把一个方法移到最后,实际上确实发生了变化。

但现在我想到的是你可以自己做。基本上调用一些diff工具,然后返回新插入的行,基本上是你移动到文件末尾的方法。然后你可以自己做一个比较,无论你上一个文件中已经存在更改的行。

答案 10 :(得分:0)

我认为,要在线比较文件,您应该使用http://www.diffnow.com。我正在使用此选项来比较选择语言,非常好

答案 11 :(得分:-1)

来自SourceGear的DiffMerge非常出色,可免费使用。

http://www.sourcegear.com/diffmerge/