测试C#ness或VBness的字符串

时间:2014-07-13 22:13:58

标签: c# vb.net string

确定字符串是代表VB.NET还是C#代码的中途可靠方法是什么?它在所有情况下都没有工作,所以一个超过50%的时间的算法总比没有好。

我想出了以下内容,但它非常原始。

public static ExpressionLanguage TryDetermineLanguage(string text)
{
  int csCount = 0;
  int vbCount = 1;

  csCount += text.Count(';');
  csCount += text.Count("//");
  csCount += text.Count("/*");
  csCount += text.Count("{");
  csCount += text.Count("}");

  vbCount += text.Count("If");
  vbCount += text.Count("Then");
  vbCount += text.Count("Else");
  vbCount += text.Count("End");
  vbCount += text.Count("Return");

  if (vbCount > csCount)
    return ExpressionLanguage.VisualBasic;
  if (csCount > vbCount)
    return ExpressionLanguage.CSharp;

  return ExpressionLanguage.Unknown;
}

我可以在我的项目中访问Roslyn,但我希望无需经过完整的解析和编译循环就可以使用它。

2 个答案:

答案 0 :(得分:4)

这完全取决于您希望它的效果。一种非常简单的方法可能会很好地计算字符{}的出现次数与单词"End"的出现次数的比较。最有可能的是{}End更多,那么它就是C#。

需要更多工作的更可靠的方法是检查大量的C#和VB代码来构建和存储每种语言的三元模型。然后,给定一段特定代码,在该代码中构建三元组的直方图,并将其与存储的模型进行比较。

除非您的程序具有识别和丢弃带引号的字符串和注释中的文本的智能,否则这两种技术都会在存在大引号字符串和注释时崩溃。但如果你不担心这些边缘情况,我怀疑上面的第一种技术在大多数情况下会做得很好。

答案 1 :(得分:1)

最好的方法取决于几个因素。

  1. 字符串 vb还是C#还是不是?
  2. 字符串是功能代码块,还是只是一段随机文本?
  3. 如果是功能代码块,最小大小是什么(单个语句或表达式,方法,方法签名,整个类)。
  4. 但快速而肮脏的“只是试试这个”方法可能只是寻找分号或引号字符串之外的{或}。如果找到,则c#,如果不是vb。