简体   繁体   中英

Automatically Add Regions to Code in Visual Studio

My team absolutely loves using regions, and with that in mind it's pretty much become a de-facto standard in our code. I recently came to realization that I'm sick of writing or ctrl+c / ctrl+v'ing these in every time I create a class, test method, etc...

I was wondering if it is possible (via macros or some other functionality) to have Visual Studio automatically add these into your code.

For example, If I add a new class file to my project, can you perform some sort of magic to have visual studio generate the file as:

namespace Test
{
    class MyClass
    {
        #region ------------ members --------------
        #endregion

        #region ------------ properties --------------
        #endregion

        #region ------------ methods --------------
        #endregion
    }
}

Where I really get annoyed by not currently knowing how to do this, is when I'm writing unit tests. This may be a bit trickier, but I was trying to find a way to add --set up-- and --run test-- regions automatically to test methods because our team is adamant about using them.

So, when I go to create a new test method

[TestMethod]
public void WhenCondition_WillProduceExpectedResult()
{
}

Visual Studio would automatically add these two regions to the method, such as:

[TestMethod]
public void WhenCondition_WillProduceExpectedResult()
{
   #region ------------- set up -------------
   #endregion 

   #region ------------- run test -------------
   #endregion 
}

Not sure if this can be done, and if it can, whether it'd be via a vs-macro, or extension. Any help is much appreciated!

You could create a simple code snippet like the following one:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets
    xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Simple</Title>
      <Shortcut>simple</Shortcut>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>name</ID>
          <ToolTip>Replace with the name of the action</ToolTip>
          <Default>Action</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[
        public void $name$()
        {
            #region ------------- set up -------------
            #endregion 

            #region ------------- run test -------------
            #endregion 
        }
        ]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Save that file into C:\\Users\\<your_user>\\Documents\\Visual Studio 2010\\Code Snippets\\Visual C#\\My Code Snippets .

Now you just need to reopen Visual Studio, type 'simple' into a class and press Tab key twice.

Two ways I know:

Create a snippet as per this MSDN guide .

Downloading the Visual Studio Extension Productivity Power Tools which has a "Surround" feature. This surrounds the user made selection with the selected snippet, for example #region #endregion or if statement.

Don't know why so many people speak out against regions; they help me categorize my code very easily. What I use is a macro placed on one of my keyboard buttons that automatically inserts the regions for me. One tip I can give you is to put a small delay between each keypress if this is possible because VS sometimes misses characters otherwise.

Hope this helps!

Use the following snippet

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>#Classregion</Title>
      <Shortcut>#Classregion</Shortcut>
      <Description>Code snippet for #Classregion</Description>
      <Author>Author Name</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>name</ID>
          <ToolTip>Region name</ToolTip>
          <Default>MyRegion</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[
        #region ------------- Members ---------------
        $selected$ $end$
    #endregion

  #region --------------- Properties ---------------
        $selected$ $end$
    #endregion

  #region --------------- Methods ---------------
        $selected$ $end$
    #endregion
    ]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Save it under C:\\Users\\\\Documents\\Visual Studio 2010\\Code Snippets\\Visual C#\\My Code Snippets

Later it will be accessible in C# code, by Right-Click > Insert Snippet > My Code Snippets > #Classregion

If you have Resharper then the File Structure window is very handy for managing regions, allowing simple drag and drop to move blocks of methods/properties etc. around. It shows your regions (which are collapsible) & syncs with the main code view too:

https://www.jetbrains.com/help/resharper/Reference__Windows__File_Structure_Window.html

eg A region called preview shown here:

这里

I prefer editing the class template as described in Sam Harwell's answer:

https://stackoverflow.com/a/2072717

You can open the class.cs file at your Visual Studio version's class template location. For example, Visual Studio 2017 Enterprise's location is:

C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\Common7\\IDE\\ItemTemplates\\CSharp\\Code\\1033\\Class\\Class.cs

I open that file using a text editor and add regions to it. All new classes will then be created with the regions.

And I agree that regions a are a bad idea but to each his own.

You might want to take a look at NArrange .

Late to the party but for anyone coming to this question in future like me,

It's possible in Visual Studio using CodeMaid Extension at least in VS2022.

After installing the extension go to options of code maid and enable Insert new regions.

在此处输入图像描述

After enabling it you need to use Reorganize document on your class and it does the job very well.

重组活动文档

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM