C# 在VisualStudio2010中突出显示Goto
我目前正在翻译旧的生成的C#代码,其中充满了goto。请不要对此发表评论,我知道这很可怕。 无论如何,有没有一种方法/扩展/其他方法可以让goto语句更具可读性?很难找到代码跳转的地方。我不想使用搜索功能,因为它会让我迷失方向 我所发现的是: 但它不起作用 你能推荐点什么吗?试试ReSharper'sC# 在VisualStudio2010中突出显示Goto,c#,visual-studio-2010,C#,Visual Studio 2010,我目前正在翻译旧的生成的C#代码,其中充满了goto。请不要对此发表评论,我知道这很可怕。 无论如何,有没有一种方法/扩展/其他方法可以让goto语句更具可读性?很难找到代码跳转的地方。我不想使用搜索功能,因为它会让我迷失方向 我所发现的是: 但它不起作用 你能推荐点什么吗?试试ReSharper's 或CODURUH的 你可以考虑。code>goto语句将得到如下箭头:。将光标悬停在箭头上会突出显示标签后面的语句(如果它已经可见),单击它会使其可见并将光标移动到该语句。还要注意,您可以使用“C
或CODURUH的
你可以考虑。code>goto语句将得到如下箭头:。将光标悬停在箭头上会突出显示标签后面的语句(如果它已经可见),单击它会使其可见并将光标移动到该语句。
还要注意,您可以使用“Ctrl”+“-”跳回代码中您所看到的最后一个位置。这可能非常明显,但在我看来,CSharpie可能不知道这个热键。可能有点晚了,但您可以使用Visual Studio扩展性构建自己的热键(因此也可以添加自定义行为):。这些步骤是: 1) 创建编辑器分类器项目(内置项目类型) 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;
}
}
内部类GoTotager:ITagger
{
私有的ITextSearchService\u文本搜索服务;
私有ITextStructureNavigator\u textStructureNavigator;
事件事件处理程序ITagger.TagsChanged{add{}remove{}
公共GoTotager(ITextSearchService textSearchService、ITextStructureNavigator textStructureNavigator)
{
_textSearchService=textSearchService;
_textStructureNavigator=textStructureNavigator;
}
公共IEnumerable GetTags(normalizedSnapshotSpan集合范围)
{
如果(spans.Count==0)
屈服断裂;
如果(spans.Count>0)
{
//查找“转到”事件
foreach(在_textSearchService.FindAll中的快照span(新的FindData(“goto”,span[0]。快照,FindOptions.WholeWord | FindOptions.MatchCase,_textStructureNavigator)))
{
返回新标记span(span,new GotoTag());
}
}
}
}
[导出(类型(IViewTaggerProvider))]
[TagType(typeof(TextMarkerTag))]
[ContentType(“code”)]//仅适用于代码部分。例如,可以更改为csharp以仅对C代码着色
内部类GotoTaggerProvider:IViewTaggerProvider
{
[进口]
内部ITextSearchService文本搜索服务{get;set;}
[进口]
内部ITextStructureNavigatorSelectorService文本结构NavigatorSelector{get;set;}
公共ITagger CreateTagger(ITextView textView,ITextBuffer buffer),其中T:ITag
{
如果(textView.TextBuffer!=缓冲区)
返回null;
将新的GoTotager(TextSearchService、TextStructureNavigatorSelector.GetTextStructureNavigator(buffer))作为ITagger返回;
}
}
内部类GotoTag:TextMarkerTag
{
public GotoTag():base(“goto”){}
}
[导出(typeof(EditorFormatDefinition))]
[姓名(“转到”)]
[用户可见(正确)]
内部类GotoFormatDefinition:MarkPerformatDefinition
{
公共GotoFormatDefinition()
{
背景颜色=颜色。红色;
ForegroundColor=颜色。白色;
DisplayName=“转到Word”;
ZOrder=5;
}
}
不好的可读性正是我们避免使用goto
的原因吗?好吧,我认为有一个想法可以尝试,使用工具->选项->文本编辑器->格式->缩进->标签缩进->将goto标签放在最左边的列中,这至少会使所有标签都很快被注意到。您提到的扩展是用于代码中符号之间的导航,而不是用于查找GOTO语句。@Aschratt您应该阅读我写的内容。我不打算使用goto,但我需要帮助来摆脱它,这个过程的一部分是首先让mroe能够阅读这些东西。@CSharpie:我理解你写的东西。。。这只是一个修辞问题;)更多的是关于它去哪里的线路。我还是会保留你的密码,因为我现在有了更多的想法。我知道,谢谢。主要原因是很难理解代码的作用。虽然跳回起点会有所帮助,但在嵌套的事情中,找出发生了什么并没有帮助。