【问题标题】:Does anyone know of an advanced diff tool for C#?有人知道 C# 的高级差异工具吗?
【发布时间】:2009-07-21 19:24:43
【问题描述】:

我正在寻找一种差异工具,它可以分析我的代码并告诉我在逐个构造的基础上发生了哪些变化。

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

我使用了各种 diff 工具,但它们似乎都无法告诉您已插入、删除或更改行,但无法以任何合乎逻辑的方式告诉您更改是什么。如果我定期重新排列代码文件的布局时,差异工具可以跟上,那就太好了。

有人有这样的工具吗?

【问题讨论】:

  • 这不是源代码控制更改 cmets 的用途吗? :)
  • 您是否还在等待支持回复您,我很想看看您发现了什么。
  • 仍在等待。他们联系我,问我追求的是什么 C# 方言。告诉他们我正在寻找 2.0 (.NET 3.5) 并询问价格以及他们是否会发布试用版并且从那以后没有收到他们的消息。
  • @Ben:于 2009 年 9 月 4 日向您发送电子邮件,邀请您使用 C# 3.0 的 beta 副本。没有回应。
  • Ben 要求并收到一份测试版。

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


【解决方案1】:

我用http://winmerge.org/

我认为您不能按照您的要求去做,因为 longest common subsequence 算法适用于这些工具的方式。

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

编辑:
这有点牵强,但如果您感觉更有野心,您可以编写适合您的确切需求的自己的内容。

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

除此之外,我不知道你将如何完成你正在寻找的东西。

【讨论】:

  • 实际上,Winmerge 有一个选项来检测移动的文本块。它们的标记与更改或添加/删除的标记不同。
  • 我仍然认为“标记”
  • Ira Baxter 发布了一个项目,它可能正是程序员对差异所需要的那种东西,它可能支持多种语言。我只是在等待他们的支持团队的回复,看看这是否真的是它所承诺的一切。
  • 正则表达式?真的吗?
【解决方案2】:

查看我们的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 类中的洗牌方法在语义上也是空的,但是洗牌 字段 不是由于初始化器的评估顺序。我不知道这对于 C# 是否也是如此,但这不会让我感到惊讶。]

【讨论】:

  • 还没有检查过,但我到办公室会检查。不过听起来很有希望 - 我很高兴看到它的能力!
  • 好的,所以我不知道在哪里可以找到该工具的下载地址来试用 C# - 只是等待他们的支持人员的回复。我已经祈祷了,这就是我希望的一切。
  • C# eval 版本的下载链接已损坏(在撰写本文时):semdesigns.com/Products/SmartDifferencer/…
  • Richard 的链接问题是他的链接转录不正确。您可以转到semanticdesigns.com/Products/SmartDifferencer/… 并从那里轻松下载评估。
  • 大家好,只是想添加这个来自 SemanticDesigns 首席执行官的 SmartDifferencer 视频剪辑讨论,他在 GoogleTechTalks 发表演讲
【解决方案3】:

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

【讨论】:

  • 这是一个有趣的想法——理论上我不需要区分没有进入 VCS 的文件,只有可编译的应用程序才会进入,所以这可以工作——正如我所说,理论上.我会检查那条路。
  • 它不是一个“完美”的解决方案,但它提供了一种有趣的方法来查看与编译器另一端的不同之处。如果您还没有使用过 .NET Reflector,请务必查看其他加载项,因为它们肯定会使已经令人印象深刻的工具变得更好。对于否决此回复的任何人,请解释原因。如果你发现我的回答有缺陷,你应该站出来说出你发现的问题。
【解决方案4】:

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

【讨论】:

  • 这看起来棒极了!我认为这应该是标记的答案。
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

    Beyond Compare by Scooter Software 非常适合这个,而且它也很便宜(30 美元)。

    【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      我知道您正在寻找工具。但由于我一无所知,以下是我将如何做到这一点:

      1. 读一本关于编译器设计的书
      2. Lex/解析您的代码
      3. 创建抽象语法树
      4. 发明一种在语法树上执行差异的算法
      5. 利润!

      【讨论】:

      • 已经在考虑这个 - 我认为这将是一个很棒的工具,因为很明显它还不存在。唯一的问题是您如何对具有单独文件不满足的依赖项的类进行 lex/parse ?它不会工作......
      • 也许这将是一个完整的“项目”或“解决方案”差异。您的编译器已经处理了这一点,因此应该不难弄清楚。如果可能的话,让它与语言无关也很整洁。所以可以很容易地添加其他语言。我敢肯定,很多人会为它作为产品付费。
      【解决方案9】:

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

      【讨论】:

      • OP:“我正在寻找一种差异工具,它可以分析我的代码并告诉我在逐个构造的基础上发生了哪些变化”。 DiffMerge 是否合并? -1
      【解决方案10】:

      正如许多人所建议的,我想这种比较对于可用的差异工具是不可能的。因为它们的目的是说明是否发生了某些变化,如果您将方法从头到尾移动,那么实际上确实发生了变化。

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

          SourceGear 的 DiffMerge 非常出色,而且可以免费使用。

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

          【讨论】:

          • OP:“我正在寻找一种差异工具,它可以分析我的代码并告诉我在逐个构造的基础上发生了哪些变化”。 DiffMerge 是否合并? -1
          猜你喜欢
          • 1970-01-01
          • 2010-12-26
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-22
          相关资源
          最近更新 更多