【问题标题】:Namespaces in DelphiDelphi 中的命名空间
【发布时间】:2011-01-07 04:40:24
【问题描述】:

使用长单位文件名有什么实际好处吗? MyLib.MyUtils.pas 还是只是一种单位名称前缀?

【问题讨论】:

    标签: delphi namespaces


    【解决方案1】:

    见:

    Why does Delphi (dcc32.exe) have an option to set a “Namespace search path”?

    Delphi 中的命名空间是编译器支持的,所以单元名中的点有特殊的含义。您可以使用文件的完整限定名,或者如果 dcc32.exe 选项设置正确,则可以使用“快捷方式”样式作为文件名。

    所以你也可以写

    uses
      MyBestTools;
    

    避免使用完整的限定名

    uses
      MyCompany.MyProject.MyLibrary.MyBestTools;
    

    免责声明:目前这只是理论,但我会在不久的将来在一些项目中使用命名空间

    如需更好的 IDE 支持,请随时在 QualityCentral 中投票支持此功能建议:

    Visualize the unit namespaces hierarchy in the IDE

    【讨论】:

    • 我在 IDE (Delphi 2009) 中找到了相同的选项:Project/Options/Delphi Compiler/Default Namespace, NameSpace Prefixes
    • 在 Delphi XE7 IDE 中称为“单元范围名称”
    • @SoftDeveloper XE7 是否还有 dcc32 的 -NS<namespaces> = Namespace search path 参数?
    • @mjn 是的,只是 IDE 选项名称发生了变化
    【解决方案2】:

    我编辑了这个答案以回应 cmets 和我对问题的明显误解。

    我看到使用您所建议的单元名称的唯一实际好处是,IDE 将以比不使用“命名空间”前缀更好的方式对单元进行排序。我宁愿使用不同的文件夹。

    在某些情况下,这可能是有意义的 - 因为名称冲突。例如,您可以有一个单元 MyLib.Utils 和一个单元 MyOtherLib.Utils 这确实可以避免一些混淆(对于 IDE 和您自己)。

    您还可以使用带有静态类方法的抽象类来模拟命名空间:

    type
      Utils = class abstract
        class procedure Beep; static;
      end;
    ...
    Utils.Beep;   
    

    【讨论】:

    • 如果我对 Serg 的理解正确,他会询问 inside(而不是之后)单位名称的点。
    • 你可能是对的,因为问题不是很详细。我编辑了我的答案以反映这种可能性。
    • 当然问题是关于“带点”的单位名称。据我了解,点只是单位名称前缀中的另一个符号,仅此而已。例如,你不能写“uses MyLib”来使用 MyLib.MyUtils 或以任何其他方式使用“MyLib”标识符。
    • 好的,我想我明白了。我编辑了答案。希望它现在更有帮助。
    • @Serg:DCC32.exe 有一个特殊选项来设置默认命名空间。因此,如果您将默认名称空间设置为 MyLib,您可以使用 MyUtils。
    【解决方案3】:

    命名空间与所有标识符一样,旨在进行组织。

    因此,使用它们,只有在您的项目以更好的方式组织时才会受益。 这个高度主观的问题(即使是最简单的命名约定也有“战争”!),所以不可能真正回答。

    Here is some documentation 了解命名空间在 Delphi 中的工作原理。

    请注意,“真正的”命名空间(其中多个通用 DLL 可以贡献给同一个命名空间;这就是命名空间在 .NET 世界中的作用方式)在 Delphi 中是不可能的:您可以采用 BPL 方式,但那是与“通用 DLL”不同。这不是 Delphi 本身的限制,而是 Windows 中本机 DLL 的“工作”方式。

    --杰罗恩

    【讨论】:

    • +1 个有趣的链接。我什至不知道 Delphi 中有“官方命名空间”。
    • 看起来文档文章是为 Delphi.NET(dcuil 文件等)编写的。 Embarcadero 必须对其进行编辑以记录 Delphi for Win32 命名空间。
    • +1 感谢您的链接...现在我正在寻找支持这些命名空间前缀的版本的任何参考...
    • @JerryDodge 据我所知,Delphi 7 之后的任何 Delphi 版本都支持它。 Delphi 附带了 Delphi .NET 命令行编译器的预览版,从那时起每个 Delphi .NET 编译器都支持它,我认为任何原生 Delphi 编译器也支持它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多