为什么Visual Studio默认不创建公共类?

Vad*_*dim 43 c# visual-studio

在Visual Studio中添加新类时,它始终创建时不使用修饰符,并使类成为内部类.

class MyClass
{
}
Run Code Online (Sandbox Code Playgroud)

我希望我的类默认创建为公共类.

为什么默认是内部的?

你更喜欢什么?

Ant*_*lev 28

internal默认情况下制作类对我来说非常有意义:保持对自己的私有,并且只明确暴露真正需要暴露的部分:其他一切只是实现细节,不应该对外界可见.

如果你想测试你的internal类,.NET 2.0以后引入了一个名为InternalsVisibleToAttribute的新属性,

指定仅在当前程序集中通常可见的类型对另一个程序集可见.

如果这真的让你烦恼,请看%ProgramFiles%\Microsoft Visual Studio 8\Common7 IDE\ItemTemplates\CSharp\1033\Class.zip.这是一个模板,您可以根据自己的需要进行更改.ReSharper具有类似的功能,但可以从UI内直接访问.

  • 安东,你能说得更具体吗?这不是我第一次出错.我只是想知道我错了什么. (13认同)
  • 默认情况下,ReSharper会创建公共类.这对我来说非常有意义. (12认同)
  • VS 2017的正确路径是`C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class` (7认同)
  • 在开发可重用包时默认为“内部”是有意义的,但在应用程序代码中没有意义,特别是当解决方案结构分为基础设施/域/应用程序层时。在这种情况下,大多数类需要在其他程序集中可访问。 (5认同)
  • @Vadim:你错了. (4认同)

Aar*_*man 15

默认情况下为Visual Studio 2012创建一个Public类:

编辑此文件: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs

看起来像这样:

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$
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息:http://aaron-hoffman.blogspot.com/2013/05/edit-default-visual-studio-2012-item.html


Mic*_*ren 5

C# 倾向于将所有内容默认为必要的最小范围。这是一个很好的约定,并在 Skeet 的书中引用(C# In Depth,p 224 "Note/Trivia"):

[属性是] 唯一需要“私有”的地方——在 C# 的其他任何地方,任何给定情况下的默认访问修饰符都是可能的最私有的。换句话说,如果某些东西可以被声明为私有的,那么完全省略访问修饰符将默认它是私有的。这是语言设计的一个很好的元素,因为它很难被意外弄错:如果你想要一些比它更公开的东西,当你尝试使用它时你会注意到。

  • 实际上,默认情况下类是内部的。班级成员是私人的。 (8认同)
  • 乔是对的。类*不能*是私有的(除非它们嵌套在其他类型中),尽管默认情况下它们的成员是私有的。 (2认同)