跨多个 C# 文件拆分单个命名空间有什么好处?

问题描述

我正在阅读一本书,其中显示了以下示例:

假设您正在开发一个名为 Square 的几何类集合, 圆形和六边形。鉴于它们的相似性,您希望将它们组合到 CustomNamespaces.exe 程序集中名为 MyShapes 的唯一命名空间中。您有两种基本方法。首先,您可以选择在单个 C# 文件 (ShapesLib.cs) 中定义所有类,如下所示:

// ShapesLib.cs
using System;

namespace MyShapes
{
    public class Circle { /* Interesting members... */ }

    public class Hexagon { /* More interesting members... */ }

    public class Square { /* Even more interesting members... */ }
}

虽然 C# 编译器对包含多种类型的单个 C# 代码文件没有问题,但当您想在新项目中重用类定义时,这可能会很麻烦。例如,假设您正在构建一个新项目并且只需要使用 Circle 类。如果所有类型都在单个代码文件中定义,您或多或少会被整个集困住。因此,作为替代方案,您可以将单个命名空间拆分为多个 C# 文件

// Circle.cs
using System;
namespace MyShapes
{
    public class Circle { /* Interesting methods... */ }
}

// Hexagon.cs
using System;
namespace MyShapes
{
    public class Hexagon { /* More interesting methods... */ }
}

// Square.cs
using System;
namespace MyShapes
{
    public class Square { /* Even more interesting methods... */ }
}

我不太明白,在新项目中重用类定义是什么意思?在这两种情况下,当你想在其他项目中使用Circle类时,你需要显式使用MyShapes.Circle c = new Circle()或者使用using MyShapes; Circle c = new Circle();,所以“定义一个中的所有类单个 C# 文件”或“将单个命名空间拆分为多个 C# 文件”?

解决方法

"你或多或少都被整个系列卡住了。因此,作为一个 或者,您可以将单个命名空间拆分为多个"

措辞令人怀疑,而且您的直觉是正确的,您仍然对整个集合感到困惑。它们是一回事,唯一的区别是每个文件都有一个类,它们共享相同的命名空间(有些人可能会说)可以通过多种方式更容易维护,例如可读性、git 提交和合并等。

在任何正常意义上并直接与作者评论“你或多或少被整个集合卡住”一样,这只会在你将每个形状放在一个不同的项目/ Nuget,您可以有选择地和细粒度地引用每个形状,其优点是所有形状仍位于相同的原型命名空间下。即便如此,形状也不是最好的比喻。

不必拘泥于措辞的语义,作者只是暗示您可以将各个类拆分到文件中,并使它们仍然驻留在同一个命名空间中。

,

当你想在新项目中重用类定义时很麻烦

基本上,这正是所写的。如果你有一个包含多个类的项目的命名空间,如果将来你想重用一个类(为什么在你已经完成了腿部工作的情况下重新发明轮子 - 在专业环境中很常见),你将不得不导入您需要的类。

但是,如果您只需要导入一个类(即包含在您的项目中),但该类位于代表多个类的文件中 - 您将导入所有其他类,即使您将要从事的项目不需要它们。这是浪费内存。

此外,这不是已经提到的,将类分离到它们自己的文件中是一个很好的做法,以便将来更容易阅读和代码管理。特别是如果您的类将增长以表示具有许多方法、属性等的大型对象时。您不希望拥有 1000 行以上的文件。

,

一个类=一个文件有很多很好的理由。

  1. 您可以将单个 .cs 文件复制到另一个项目中,如果幸运的话它会正常工作,并且您不会导入无用的东西(我说运气不好,因为一个类经常使用其他类......例如,所有形状都可以有一个 class Shape 作为基类...然后要将 Circle 复制到另一个项目,您必须同时复制 CircleShape)

  2. 很容易找到包含类的 .cs 文件:它与类同名。如果一个文件包含多个类,文件应该有什么名字?一段时间后很容易让文件名变得“过时”,因为您添加了更多类

  3. 创建一个行数已经太大的类是很容易的......如果你开始将多个类放在同一个文件中,这个问题只会增加。但通常您不必一起检查所有类...也许今天您必须在 Circle 上工作,明天在 Square 上工作。同时拥有它们是非常没有用的。这就像总是随身携带无用的工具一样。

  4. 如果您使用 VCS(版本控制系统),例如 github,很容易看到哪些文件已被修改。如果一个文件 = 一个类,您就可以知道修改了什么。如果多个类在一个文件中,一切都会变得模糊

肯定还有其他很好的理由……但主要的好理由是:每个人都在这样做……所以这可能是正确的方法。至少在一种语言(Java)中,这不是建议,而是规则。一个文件 = 一个公开课。