【问题标题】:Highlight Goto in Visual Studio 2010在 Visual Studio 2010 中突出显示 Goto
【发布时间】:2013-03-13 08:30:50
【问题描述】:

我目前正在翻译旧的生成的 C# 代码,其中充满了 goto。请不要对此发表评论,我知道这很可怕。 无论如何,有没有办法/扩展/任何使 goto 语句更具可读性?找到代码跳转到的地方很痛苦。我不想使用搜索功能,因为它会让我失去方向。

我发现的只有这个: http://visualstudiogallery.msdn.microsoft.com/4b286b9c-4dd5-416b-b143-e31d36dc622b 而且它不起作用。

你能推荐什么吗?

【问题讨论】:

  • 可读性差不是我们避免使用goto的原因吗?
  • 好吧,我觉得有一个想法可以尝试,使用工具->选项->文本编辑器->C#->格式化->缩进->标签缩进->将转到标签放在最左边的列中,这至少可以让所有标签迅速引人注目。
  • 您提到的扩展是用于在代码中的符号之间导航,而不是用于查找 GOTO 语句。
  • @Aschratt 你应该看看我写的。我不打算使用 goto,但我需要帮助来摆脱它,这个过程的一部分是首先让这些东西 mroe 可读。
  • @CSharpie:我明白你写的……这只是一个修辞问题;)

标签: c# visual-studio-2010


【解决方案1】:

可能有点晚了,但您可以使用 Visual Studio 可扩展性构建自己的(因此也可以添加自定义行为):Inside the Editor: Tags and Classifier。步骤是:

1)创建Editor Classifier项目(内置项目类型)

2) 删除已有的类文件

3) 添加以下代码。它会将代码部分中的所有“goto”语句着色为红色:

internal class GotoTagger : ITagger<GotoTag>
{
    private ITextSearchService _textSearchService;
    private ITextStructureNavigator _textStructureNavigator;

    event EventHandler<SnapshotSpanEventArgs> ITagger<GotoTag>.TagsChanged { add { } remove { } }

    public GotoTagger(ITextSearchService textSearchService, ITextStructureNavigator textStructureNavigator)
    {
        _textSearchService = textSearchService;
        _textStructureNavigator = textStructureNavigator;
    }

    public IEnumerable<ITagSpan<GotoTag>> GetTags(NormalizedSnapshotSpanCollection spans)
    {
        if (spans.Count == 0)
            yield break;

        if (spans.Count > 0)
        {
            // look for 'goto' occurrences
            foreach (SnapshotSpan span in _textSearchService.FindAll(new FindData("goto", spans[0].Snapshot, FindOptions.WholeWord | FindOptions.MatchCase, _textStructureNavigator)))
            {
                yield return new TagSpan<GotoTag>(span, new GotoTag());
            }
        }
    }
}


    [Export(typeof(IViewTaggerProvider))]
    [TagType(typeof(TextMarkerTag))]
    [ContentType("code")] // only for code portion. Could be changed to csharp to colorize only C# code for example
    internal class GotoTaggerProvider : IViewTaggerProvider
    {
        [Import]
        internal ITextSearchService TextSearchService { get; set; }

        [Import]
        internal ITextStructureNavigatorSelectorService TextStructureNavigatorSelector { get; set; }

        public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
        {
            if (textView.TextBuffer != buffer)
                return null;

            return new GotoTagger(TextSearchService, TextStructureNavigatorSelector.GetTextStructureNavigator(buffer)) as ITagger<T>;
        }
    }

    internal class GotoTag : TextMarkerTag
    {
        public GotoTag() : base("goto") { }
    }

    [Export(typeof(EditorFormatDefinition))]
    [Name("goto")]
    [UserVisible(true)]
    internal class GotoFormatDefinition : MarkerFormatDefinition
    {
        public GotoFormatDefinition()
        {
            BackgroundColor = Colors.Red;
            ForegroundColor = Colors.White;
            DisplayName = "Goto Word";
            ZOrder = 5;
        }
    }

【讨论】:

  • 它更多地是关于它去往的那条线。仍然会保留您的代码,因为我现在有了更多想法。
【解决方案2】:

你可以考虑DevExpress CodeRushgoto 语句会得到一个像这样的箭头:。将鼠标悬停在箭头上会突出显示标签后面的语句(如果它已经可见),单击它使其可见并将光标移至该语句。

【讨论】:

    【解决方案3】:

    试试 ReSharper 的 Navigate to function exits

    或 Coderush 的 flow break icons

    【讨论】:

      【解决方案4】:

      另外请注意,您可以使用“Ctrl”+“-”跳回到您正在查看的代码中的最后一个位置。 这可能很明显,但在我看来,CSharpie 可能不知道这个热键。

      【讨论】:

      • 我知道,谢谢。主要原因是很难弄清楚代码的作用。回到起点虽然有帮助,但在嵌套的事情中,它并没有帮助找出发生了什么。
      猜你喜欢
      • 2011-10-17
      • 2012-04-25
      • 1970-01-01
      • 2012-11-13
      • 2018-09-25
      • 2013-04-10
      • 2023-03-06
      • 2012-03-15
      • 2015-11-21
      相关资源
      最近更新 更多