After maintaining lots of code littered with #region (in both C# and VB.NET), it seems to me that this construct is just a bunch of "make work" for the programmer. It's work to PUT the dang things into the code, and then they make searching and reading code very annoying.
What are the benefits? Why do coders go to the extra trouble to put this in their code.
Make me a believer!
Nice answers, I agree with them that say it sometimes reflects bad coding and design but #region actually is usefull if you're creating documentation (MSDN style) with the SandCastle. Lets say you have a public API and there is some base class that you want to give an example of usage for. Then you would properly document your public methods and add an example region where you could copy and paste some code. Problem with this is that when/if your base class changes you're supposed to change the example eventually. Better solution is to include a sample code project in your solution and build it all together, so everytime you build your solution if the sample code is not up to date it will not compile. So what does that have to do with regions you will be asking your self by now. Well look at this sample:
Notice there is a link to the source code sample file and region for the method that you want to expose as a sample in your documentation. See here the result. That method needs to be in a proper region and will be automatically included in your documentation. That's why I wouldn't throw away #region yet.
I love regions because it helps me focus on just what I am working on. I use them even if the class just has a method.
I use code snippets with regions already pre-populated, which is less typing. I feel the class is more organized and does what Code Complete talks about make it nicer for other people to read. The compiler just ignores them, they are now to make code more readable.
I find that they obfuscate the code in all but the simplest of uses. The only use we advocate in our projects are the ones the IDE uses (interface implementations and designer code).
The right tools should be used for the right purpose. Code should be written to show intent and function rather than arbitrarily grouping things. Organizing things into access modifier grouping or some other grouping just seems to be illogical. I find the code should be organized in a manner that makes sense for the particular class; after all, there are other tools for viewing class members by access modifier. This is also the case for almost every other use of regions; there is a better way.
For example, grouping properties, events, constants or otherwise together doesn't really make sense either as code is generally more maintainable if the things are grouped together by function (as in, a property that uses a constant should be near that constant, not near other unrelated properties just because it's a property).
I often use them instead of comments to order groups of functionality in the body of a class, e.g. "Configuration public interface", "Status public interface", "internal processing" and "internal worker thread management".
Using the keyboard shortcuts to "collapse to definitions" and "expand current block", I can easily navigate even larger classes.
Unfortunately, Regions are broken for C++, and MS doesn't think it needs to be fixed.
There really isn't a benefit. They are a code smell. After using them for awhile, I got sick of them. If you need to break things out by functionality, use a partial class.