C# 我是否应该停止与Visual Studio';默认名称空间命名约定?

C# 我是否应该停止与Visual Studio';默认名称空间命名约定?,c#,visual-studio,naming-conventions,namespaces,C#,Visual Studio,Naming Conventions,Namespaces,我正在处理一个MVVM项目,因此我的项目中有一些文件夹,如模型、视图模型、窗口等。每当我创建一个新类时,Visual Studio都会自动将文件夹名称添加到名称空间指定中,而不只是保留项目级名称空间。因此,向ViewModels文件夹中添加一个新类将产生名称空间,MyProject.ViewModels,而不仅仅是MyProject 当我第一次遇到这个问题时,我很恼火。我的类名非常清晰,有时甚至包含文件夹的名称(例如,ContactViewModel)。我很快发现自己手动删除了名称空间中的文件夹

我正在处理一个MVVM项目,因此我的项目中有一些文件夹,如模型、视图模型、窗口等。每当我创建一个新类时,Visual Studio都会自动将文件夹名称添加到名称空间指定中,而不只是保留项目级名称空间。因此,向ViewModels文件夹中添加一个新类将产生名称空间,
MyProject.ViewModels
,而不仅仅是
MyProject

当我第一次遇到这个问题时,我很恼火。我的类名非常清晰,有时甚至包含文件夹的名称(例如,
ContactViewModel
)。我很快发现自己手动删除了名称空间中的文件夹名称。我甚至一度尝试创建一个自定义类模板(请参见),但无法实现,所以继续手动创建

不过,我开始怀疑,这种习俗的存在是否有一个我看不到的好理由。如果出于某种原因,将许多相同的类名集合组织到文件夹中,我会认为这很有用,但这似乎不是一个特别常见的场景

问题:

  • 为什么命名空间名称通常反映文件夹结构
  • 你遵守这个公约吗?为什么?

    • 和你一样——我为此奋斗了很长时间。然后我开始考虑为什么要创建文件夹。我发现自己开始创建文件夹来表示名称空间和包,而不是任意的bucket

      例如,在MVVM项目中,将视图和视图模型放在单独的名称空间中可能会有所帮助。MVC将为模型、控制器和视图提供单独的名称空间。根据类的特征对类进行分组也是有益的

      突然,项目感觉更有条理了。其他开发人员更容易找到功能的实现位置


      如果您将名称空间实践标准化,那么您的所有项目都将具有相同的可预测结构,这将是维护的一大胜利。

      我也对Visual Studio中的这种“默认”行为感到痛苦

      当您将LinqToSql
      .dbml
      文件放在它们自己的目录中时,VisualStudio还会尝试设置名称空间/目录匹配。每当我编辑
      .dbml
      时,我必须记住:

      • 打开
        .dbml.designer.cs
        文件
      • 命名空间
        声明中删除目录/文件夹名称

      不过,还是有办法的。它涉及到创建自定义类模板。

      不遵循约定的一种方法是在项目根文件夹中创建文件,然后将其移动到最终子文件夹


      无论如何,这是一个我喜欢的惯例。如果我将类型拆分为文件夹,那么这些类型可能具有某种与文件夹相关的概念分组。因此,在某种意义上,它们的名称空间也是相似的。Java采用这种方法,并用它的包系统来实施它。最大的区别在于VS只是向您“建议”它,因为该语言或CLR都不强制执行它。

      文件系统文件夹和名称空间都代表一个层次结构。在我看来,我很自然地能与这两种人相配。我甚至更进一步,在文件和类之间使用1:1的关系。当我用其他语言编程时,我甚至会这样做,比如C++。
      既然您对这两个层次结构之间的关系提出了疑问,我真的很想知道您希望用文件系统层次结构来表示什么。

      我也对此感到恼火,但使用大型代码库处理和重构项目很快就教会了我其他方面的知识。接受了这个概念后,我认为这是一种非常好的方法,可以“物理”和逻辑地构造代码。当您有一个大型项目,并且名称空间与文件夹不匹配时,很难快速找到文件。记住东西在哪里也要困难得多


      此外,如果ReSharper推荐,那么这可能是个好主意。例如,如果您的类的名称空间与其文件夹名称不匹配,R#会投诉。

      如果您需要一些可靠的建议,我建议您购买这些建议,这些建议可以让您从实际的框架设计团队那里获得所需的所有信息

      …命名名称空间的目标是为使用框架的程序员创建足够的清晰性,以便他们立即知道名称空间的内容可能是什么

      (|)[.]
      
      重要的是

      不要对命名空间和该命名空间中的类型使用相同的名称

      将每1/2个类型分割成名称空间并不能满足第一个要求,因为如果您遵循VisualStudio的方式,将有大量的名称空间必须经过鉴定或使用。比如说

      核心 -领域 -使用者 -权限 -帐目

      你会创造吗

      • MyCompany.Core.Domain.Users
      • MyCompany.Core.Domain.Permissions
      • MyCompany.Core.Domain.Accounts
      或者只是

      • MyCompany.Core.Domain
      对于VisualStudio来说,它将是前者。此外,如果使用小写文件/文件夹命名,则每次都要重命名该类,并使名称空间变得混乱


      大部分都是常识,实际上是指如果您是自己的API或框架的消费者,您希望如何组织名称空间。

      虽然我同意其他人的观点,物理结构与逻辑结构匹配是有帮助的,但我不得不说,我也反对Visual Studio的自动命名。我必须重命名类的原因有六个:

      • 我使用根“src”文件夹将代码与嵌入的资源直观地分开
      • 我想要不同的大写字母
      • 我将把代码组织到子文件夹中,以便在命名空间中进行组织
      • 我喜欢分居
        <Company>.(<Product>|<Technology>)[.<Feature>][.<Subnamespace>]