繁体   English   中英

为什么这个名称空间可以正确解析?

[英]why does this namespace resolve correctly?

我只是在看一个项目,却看到一些我认为不应该起作用的东西。

如果您查看下面的代码段,则位于命名空间CustomFields.DateTimeField.Drivers ,该文件中唯一其他using语句是CustomFields.DateTimeField 下面的其他命名空间。

但是,如果您查看public class DateTimeFieldDriver行,则使用的是Fields.DateTimeField类型。

查看命名空间CustomFields.DateTimeField.FieldsDateTimeField的定义,但我仅为其姐妹命名空间设置了uses。

因此,问题是双重的-为什么这样做有效? 这被认为是不好的做法吗?

有问题的代码段:

using System;
using JetBrains.Annotations;
using Orchard;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.Localization;

using CustomFields.DateTimeField.Settings;
using CustomFields.DateTimeField.ViewModels;

namespace CustomFields.DateTimeField.Drivers {

    [UsedImplicitly]
    public class DateTimeFieldDriver : ContentFieldDriver<Fields.DateTimeField> {

        public IOrchardServices Services { get; set; }

        private const string TemplateName = "Fields/Custom.DateTime"; // EditorTemplates/Fields/Custom.DateTime.cshtml

        public DateTimeFieldDriver(IOrchardServices services) {

            Services = services;
            T = NullLocalizer.Instance;
        }

如果您想调查该项目,可以在这里下载 (MVC2项目)。

当您声明代码在特定的名称空间中时,例如CustomFields.DateTimeField.Drivers ,您也将隐式导入所有“父”名称空间。

在这种情况下,您将隐含用于CustomFieldsCustomFields.DateTimeField 这就是为什么不必为CustomFields.DateTimeField类型以及其中所包含的子命名空间指定显式using语句的原因

因此Fields.DateTimeField通过将发现CustomFields.DateTimeField (隐含的命名空间)与Fields.DateTimeField (显式的命名空间)来解决,以CustomFields.DateTimeField.Fields.DateTimeField

据我所知,这不算是不好的做法。

在C#中,当您位于名称空间中时,每个父名称空间都具有隐式using 例如在此文件中:

using System;

namespace Foo.Bar.Baz {

    class Qux {
    }
}
\EOF

与此文件相同:

using System;

using Foo;
using Foo.Bar;

namespace Foo.Bar.Baz {

    class Qux {
    }
}
\EOF

如果导入了名称空间,则无需指定完整的名称空间即可访问同级名称空间树的成员,只要它具有与导入的名称空间相同的前缀即可:

using Foo;
using Foo.Bar;

namespace Foo.Bar.Baz {

    class Qux {
    }
}

namespace Foo.Bar.Norf {

    class Guf : Bar.Baz.Qux { // namespace `Foo.` is implicitly assumed to prefix the namespace reference `Bar.Baz`
    }
}
\EOF

您将同时遇到这两种效果:隐式命名空间前缀对隐式导入的命名空间的使用。

至于“不好的做法”-经验丰富的C#开发人员将熟悉这种细微差别,但是除非您的名字不明确,否则通常这不是问题。

提示,请尝试最小化名称空间的数量及其深度。 例如,在您的情况下,我看到您将特定于DateTime的内容存储在其自己的DateTimeField命名空间中。 这对我来说是一种难闻的“代码气味”。 我只是将所有内容都放在CustomFields命名空间中,尤其是当您为每个类型名都赋予前缀DateTime ,所以它只是重复输入。

如果名称空间中的类型少于5种,则FxCop会抱怨。

更新:我看了C#规范( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf ),第16节,但找不到任何内容它指出父名称空间是隐式导入的,这很奇怪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM