【问题标题】:Namespace and Classes - Resolving Naming Ambiguity命名空间和类 - 解决命名歧义
【发布时间】:2017-08-26 17:57:49
【问题描述】:

我遇到的问题是 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
    {
    }
}

所以是说它不喜欢我的项目命名空间中有“解析器”吗?

但根据 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 指南描述该功能并根据其功能正确命名该类。)

【问题讨论】:

    标签: c# namespaces


    【解决方案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*();
    

    (* 添加强调:) )

    或者,就像您在上一个代码 sn-p 中所做的那样,添加一条 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
        {
        }
    }
    

    【讨论】:

    • 好的,我知道第一部分了。关于第二部分(在你的“或”之后),如果我的文件中有using TesterStories.Voxam.Parser; 并执行此操作:Parser parser = new Parser(); 在课堂上......那是行不通的。我得到“解析器是一个命名空间,但它像一个类型一样使用。”我只是想确保我没有误读你的第二部分。但是,我再次看到你第一部分的重点。
    • 啊,但我可以这样做:Parser.Parser parser = new Parser.Parser(); 有趣。来自 Java 背景,这对我来说有点认知摩擦。我仍然觉得我必须(在某种程度上)命名它不是的东西,这样我就不必重复(“Parser.Parser”)。但是,这是我的问题,不是其他人的问题!感谢您的回复。
    • @JeffNyman 看看对答案的编辑是否有帮助(因为您不必重复“Parser.Parser”)。
    • 知道了!这就说得通了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多