Why Visual Studio doesn't create a public class by default? [duplicate]

In Visual Studio when you add a new class, it always created with no modifiers and that makes class internal.

class MyClass
{
}

I would prefer that my class by default is created as public one.

Why is it internal by default?

What would you prefer?


Solution 1:

Making class internal by default makes perfect sense to me: keep your privates to yourself and only explicitly expose parts which really need to be exposed: everything else is just implementation details and should not be visible to the outside world.

In case you want to test your internal classes, .NET 2.0 onwards introduces a new attribute called InternalsVisibleToAttribute, which

Specifies that types that are ordinarily visible only within the current assembly are visible to another assembly.

If this really annoys you, see %ProgramFiles%\Microsoft Visual Studio 8\Common7 IDE\ItemTemplates\CSharp\1033\Class.zip. This is a template which you can change to suit your needs. ReSharper has similar capability, but it's directly accessible from within th UI.

Solution 2:

To create a Public class by default for Visual Studio 2012:

Edit this file: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs

(Visual Studio 2022: C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class)

To look like this:

using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;
$if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks;
$endif$
namespace $rootnamespace$
{
    public class $safeitemrootname$
    {
    }
}

More info: http://aaron-hoffman.blogspot.com/2013/05/edit-default-visual-studio-2012-item.html

Solution 3:

C# tends to default everything to the minimum scope necessary. This is a nice convention and quoted in Skeet's book (C# In Depth, p 224 "Note/Trivia"):

[Properties are the] only place where “private” is required—Everywhere else in C#, the default access modifier in any given situation is the most private one possible. In other words, if something can be declared to be private, then leaving out the access modifiers entirely will default it to being private. This is a nice element of language design, because it’s hard to get it wrong accidentally: if you want something to be more public than it is, you’ll notice when you try to use it.

Solution 4:

I prefer it the way it is. This way you have to consciously decide that you want it exposed to public. It's much like the argument, do you want your computer open to the outside world by default or would you rather configure it for internet access yourself.

Both approaches have their advantages, one has major potential security implications that I believe you should be aware of and make a conscious decision about rather than just it just happening automatically.

Solution 5:

Because in C#, a class is internal by default. VisualStudio is therefore following the C# specification.

The following article explains access modifiers and default visibility in C#.

http://msdn.microsoft.com/en-us/library/ms173121.aspx