[英]why does this namespace resolve correctly?
我只是在看一个项目,却看到一些我认为不应该起作用的东西。
如果您查看下面的代码段,则位于命名空间CustomFields.DateTimeField.Drivers
,该文件中唯一其他using
语句是CustomFields.DateTimeField
下面的其他命名空间。
但是,如果您查看public class DateTimeFieldDriver
行,则使用的是Fields.DateTimeField
类型。
查看命名空间CustomFields.DateTimeField.Fields
中DateTimeField
的定义,但我仅为其姐妹命名空间设置了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
,您也将隐式导入所有“父”名称空间。
在这种情况下,您将隐含用于CustomFields
和CustomFields.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.