命名空间和类 - 解决命名歧义

时间:2017-04-01 14:19:52

标签: c# namespaces

我得到的问题是“名称空间在C#项目中被用作类型”。我明白为什么会这样,我明白我要做些什么来解决它。但这对我来说没什么意义,因此这里的问题是理解C#上下文中命名空间和类的设计。

我希望这个问题与其他问题不同,因为我不是在问如何解决这个问题,而是在处理我描述的情况时如何保持逻辑和相关的命名。

我已遵循MSDN约定来命名解决方案。所以我有一个解决方案:

TesterStories.Voxam

我有两个项目。一个是TesterStories.Voxam.App,看起来像这样:

namespace TesterStories.Voxam.App
{
    TesterStories.Voxam.Parser parser = new TesterStories.Voxam.Parser();

    class Program
    {
    }
}

问题在于第三行。

大概是因为我有另一个名为TesterStories.Voxam.Parser的项目,看起来像这样:

namespace TesterStories.Voxam.Parser
{
    public class Parser
    {
    }
}

所以它说它不喜欢我在项目命名空间中有“Parser”吗?

但根据MSDN指南,如果Parser是该功能,那么我应该称之为命名空间:[Company].[Project].[Feature]。该课程为Parser,因为毕竟这就是班级的作用。

所以看来我要做的就是:

namespace TesterStories.Voxam.Parser
{
    public class Xyzzy
    {
    }
}

所以在这里我将Parser课程改为Xyzzy课程。现在回到导致问题的文件中我可以这样做:

using TesterStories.Voxam.Parser;

namespace TesterStories.Voxam.App
{
    class Program
    {
        Xyzzy parser = new Xyzzy();
    }
}

所以我明白了 - 但这意味着我必须改变我的课程才能成为不可能的事情。我意识到我可以称之为AppParserParserApp或其他任何内容。

在这种情况下,开发人员往往会做些什么?您是否更改了命名空间或更改了课程?即使在我的情况下,我正在根据MSDN指南描述该功能,并根据它的功能正确命名该类。)

1 个答案:

答案 0 :(得分:1)

命名空间和类名称不是问题。 在原始代码中,您需要指定此“解析器”对象应该来自TesterStories.Voxam.Parser命名空间的类。

您的原始代码:

TesterStories.Voxam.Parser parser = new TesterStories.Voxam.Parser();

TesterStories.Voxam.Parser名称空间中应该是什么类/类型?

您需要这样做:

TesterStories.Voxam.Parser.*Parser* parser = new TesterStories.Voxam.Parser.*Parser*();

(*为强调添加:))

或者,就像您在上一个代码段中所做的那样,添加一个using语句:

using TesterStories.Voxam.Parser;

这样你就可以:

Parser parser = new Parser();

编辑 - 更完整的示例(针对'使用'建议):

namespace TesterStories.Voxam.App
{
    using TesterStories.Voxam.Parser;

    class Program
    {
        Parser parser = new Parser();
    }
}

namespace TesterStories.Voxam.Parser
{
    public class Parser
    {
    }
}