我开始对我的应用程序的文件结构进行重构,因为它有各种明确定义的部分,并将它们放在各种文件夹中会使整个事情更容易理解/可维护。
当我在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
......但事实并非如此。为什么这个无缝地工作,这是否意味着我可以创建其他项目文件夹并将文件拖到他们的willy-nilly并期望所有代码仍然知道在哪里查找它所调用的代码?
虽然它编译并运行良好,但当我让Resharper猎犬松散时(通过Resharper> Inspect>解决方案中的代码问题),我得到了一些指法:
Project ReportRunner
PriceCompliance\PriceComplianceRpt.cs:13 Namespace does not correspond to file location, should be: 'ReportRunner.PriceCompliance'
如果我默认并让Resharper“解决问题”,则命名空间从“命名空间ReportRunner ”更改为“命名空间ReportRunner.PriceCompliance ”
但是,如果没有对命名空间进行重新修改,一切正常,那么将文件夹名称附加到命名空间有什么好处呢?
答案 0 :(得分:1)
命名空间和该命名空间中的类所在的文件夹不会具有匹配的。 C#或.NET中没有任何内容可以强制执行此操作。您可以调用命名空间A.Really.Long.Name.With.Lots.Of.Dots
并将类放在名为code
的文件夹中,以供编译器关注。它是一台计算机,无论被称为什么,计算机都能很好地跟踪事物。
然而,优秀的做法是组织文件夹以使它们与命名空间匹配(反之亦然),因为它使你(人类)更容易找到你的文件/文件#39;重新寻找。您很难记住代码在我的(公认的极端)示例中的位置,但在您的情况下,ReportRunner.PriceCompliance
中的所有类都将位于名为..\ReportRunner\PriceCompliance
的文件夹中,而不是位于其他位置的文件夹中硬盘。
所以ReSharper在这里所做的是强制执行 - 这是它擅长的。