为什么我将代码移至子文件夹后仍能找到我的代码?

Why is my code found even after I moved it to a subfolder?

我着手重构我的应用程序的文件结构,因为它有各种明确定义的部分,将它们放在不同的文件夹中会使整个事情变得更加 grokkable/maintainable。

当我在 Visual Studio 中创建文件夹,将 *.cs 文件移入其中,然后尝试编译时,我以为我会 运行 遇到问题。但是没有,VS 连窥视都没有,运行 没问题。

更具体地说,我在我的项目下创建了一个名为 "SharedCode" 的文件夹,然后将一个名为 SQLDBHelper.cs 的文件拖到该文件夹​​中(我没有复制它,我移动了它)。我以为引用里面的代码,比如:

DataTable dtPriceComplianceResults = SQLDBHelper.ExecuteSQLReturnDataTable(ReportRunnerConstsAndUtils.SUMMARY_STOREDPROC, . . .

...将停止工作,因为他们以前在同一层找到该文件(直接在项目下面,"ReportRunner"),现在它在 "ReportRunner\SharedCode"

但它从容应对 - 编译,并在我 运行 应用程序时成功调用。

我也有点期待 Visual Studio(或 Resharper?)会在 SQLDBHelper 中改变这一点:

namespace ReportRunner

...为此:

namespace ReportRunner.SharedCode

...但它没有。为什么这可以无缝工作,这是否意味着我可以创建其他项目文件夹并将文件随意拖到它们中,并期望所有代码仍然知道在哪里查找它调用的代码?

更新

虽然它可以编译并且 运行 没问题,但当我让 Resharper 对其进行追踪时(通过 Resharper > Inspect > Code Issues in Solution),我在这些方面得到了一些指手画脚:

Project ReportRunner
  PriceCompliance\PriceComplianceRpt.cs:13 Namespace does not correspond to file location, should be: 'ReportRunner.PriceCompliance'

如果我默许并让 Resharper "fix the problem," 命名空间从“namespace ReportRunner”更改为“namespace ReportRunner.PriceCompliance"

但是,由于在没有对命名空间进行这种更改重新锐化的情况下一切正常,因此将文件夹名称附加到命名空间有什么好处?

命名空间和该命名空间中 类 所在的文件夹 不匹配。 C# 或 .NET 中没有任何内容可以强制执行此操作。您可以调用您的命名空间 A.Really.Long.Name.With.Lots.Of.Dots 并将 类 放在一个名为 code 的文件夹中,以供编译器使用。这是一台计算机,计算机擅长跟踪事物,不管它们叫什么。

但是,组织文件夹使其与命名空间匹配(反之亦然)是一种很好的做法,因为这样可以让 you(人类)更容易找到您正在寻找的 classes/files。你很难记住代码在我的(公认的极端)示例中的位置,但在你的情况下,ReportRunner.PriceCompliance 中的所有 类 都将位于名为 ..\ReportRunner\PriceCompliance 的文件夹中,而不是其他地方在硬盘上。

因此,ReSharper 在这里所做的是加强良好实践 - 这正是它所擅长的。