Visual Studio C#语句崩溃


180

当编辑非常长的代码块时(无论如何绝对应该对其进行重构,但这超出了此问题的范围),我经常渴望能够折叠语句块,就像可以折叠功能块一样。也就是说,如果减号图标出现在大括号中所有内容的代码轮廓上,那将是很好的。它似乎出现在函数,类,区域,名称空间,用法中,但没有出现在条件或迭代块中。如果我可以折叠诸如ifs,switch,foreach之类的东西,那将是很棒的事情!

仔细研究一下,我发现显然VS中的C ++概述允许这样做,但VS中的C#概述则不允许。我真的不明白为什么。如果我选择C#格式,即使notepad ++也会使这些折叠崩溃,所以我不明白为什么Visual Studio不这样做。

有谁知道将启用此行为的VS2008加载项?还是某种隐藏设置?

编辑添加:插入区域当然是一个选项,对我而言确实已经发生了,但是坦率地说,我不必将东西包裹在已经用大括号包裹的区域中……如果我要编辑现有代码,我只是将其重构为可以更好地分离关注点。(用新方法而不是区域“包装”;)


6
顺便说一句:我发现这两个快捷方式使我的生活变得很轻松:切换大纲:Ctrl + M,M收起全部:Ctrl + M,O
Gaurav,2009年

2
Ctrl + M,L切换递归折叠/展开。当然,这可以使您只剩下一行。在该行内,尽管(Ctrl + M,M)为您提供了一个很好的摘要文件。
patridge,2010年

2
这是VS 2012的等效插件:stackoverflow.com/questions/18388280/…–
一瞥

相关:Jeff Atwood
撰写的

Answers:


267

从Visual Studio 2017开始,语句折叠是内置的。

从VS 2010版本开始,有多个扩展针对VS 2017之前的版本执行此任务:

最后一个扩展仅支持VS 2015和VS 2017,但它是功能最强大的扩展。
它支持折叠块内部的语法着色,更加容错和优化。

如果在使用浏览器下载扩展程序后似乎未安装该扩展程序,请尝试使用内置的Visual Studio扩展程序管理器。


太好了,我一直在寻找类似的东西。应该是真正的答案!(但只有在您使用VS2010非表达版的情况下,我才认为...)
rikoe 2012年

此扩展很棒,但不适用于处理程序(.ashx)
Jemsworld,2012年


3
我们甚至需要Visual Studio这个插件的事实令人费解。这应该是标准行为。天哪
Ryan Rodemoyer

@Odys,先卸载然后重新安装扩展,以解决Ctrl M + O问题。
Shahedur Ra​​hman 2014年

21

我不知道加载项,但是您提到了区域,我认为这样做没有错...

foreach (Item i in Items)
{
  #region something big happening here
  ...
  #endregion

  #region something big happening here too
  ...
  #endregion

  #region something big happening here also
  ...
  #endregion
}

编辑:针对问题的编辑:您是对的,到处都是一堆区域并不理想,重构可能是解决之道。但是看来您正在寻找一种神奇的东西,可以为您“组织”代码,但我认为这不存在。


IIRC,您无法在函数内定义区域。
Joel Coehoorn

10
他的密码是正确的;您不限于可以在其中定义这样的区域(只要您未在开始的范围之外结束)
约翰,

3
请查看原始问题的编辑;开发人员要求的手动操作(即使使用一键式或两键式区域包装快捷方式)也无法真正回答自动执行此操作的问题/愿望
Grank

1
@Joel我相信您正在考虑VB.NET
Bryan Anderson

您发现在此线程中链接的所有插件都比使用区域更好。日日夜夜。
2013年

19

您可以在Visual Studio中折叠特定的文本块,但必须关闭自动轮廓。

右键单击您的代码窗口,然后选择(概述|停止概述)

然后,选择一些文本,右键单击并选择(概述|隐藏选择)

当您再次启用自动概述时,您的自定义“区域”将不再折叠。


3
很公平。我希望通过这个问题找到一种将这些块添加到自动概述中的方法,因为对于它们而言,没有必要这样做。
Grank

1
Matt,您可以做到这一点(在VS 2012中)而无需停止自动概述。只需选择文本,然后选择大纲>隐藏选择
nawfal

3

Visual Studio 2008支持功能内部的区域,只要您将它们保持在相同的代码层次结构级别即可

#region Won't work
for(int i = 0; i<Count; i++)
{
//do something
#endregion
}

for(int i=0; i<Count; i++)
{
#region Works fine
//do lots of stuff
#endregion
}

5
这在2008年并不是什么新鲜事。2005年也支持它。

3

让我说些不同的话:(ctrl+m,ctrl+h)在编辑>概述>隐藏选择中按或,它是如此有用。


1
@Mahdi的问题是有关将折叠代码块的工具的问题。单击某些组合,则if,for / while循环等都将折叠,以便您可以尽可能高的级别读取代码。然后,您将更深入地研究代码。您的解决方案不可行,因为您必须先折叠所有区域,而看不到确切的区域。祝将来好运。
罗马

1
您可以先发表评论,然后再隐藏在该标题下,以便更加轻松和灵活
M


0

我将在此处添加,Microsoft在VS 2010中使用托管扩展框架(MEF)添加了WPF装饰器功能,这将使我们能够扩展源代码编辑器,以更好的方式组织它们,以使其更具可读性和可访问性。

例如,Scott Gu在PDC 2008上演示的“摘要评论”可视化工具。

因此,期待为开发人员创造更好的明天:)


0

Coderush将为您列出所有代码块。不知道它是否允许您扩展/折叠块,但概述是下一件好事。我使用resharper而不是coderush,据我所知,coderush也不提供块折叠:(


0

我在Visual Studio 2013中发现了这一点,并发现它非常有用。即使您使用{.....}将简单的花括号括在代码中,它也有效

分享后,我发现其他人也提到了此链接。我也为此工具投票。

Visual Studio 2013的C#概述工具


0

在VS2017中,您可以突出显示一段代码,右键单击,大纲>隐藏选择。这将折叠代码并提供对突出显示部分的切换。


-2

#region,#endregion是明智的选择。


10
StyleCop规则SA1123:DoNotPlaceRegionsWithinElements:只要将区域放置在代码元素的主体内,就会违反此规则。在许多编辑器中,包括Visual Studio,默认情况下该区域将显示为折叠状态,从而将代码隐藏在该区域中。将代码隐藏在元素的主体内通常是一个不好的做法,因为随着时间的推移,代码可能会导致错误的决策。
山姆·哈威尔2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.