c#:命名空间的问题

c#: Problems with the namespaces

我在使用 Visual Studio 2015 和 Framework 4.6.1 时遇到问题。

我有一个带有此命名空间的业务层:BusinessLayer.LocalStorage。在这个class(名为LocalStorage)中我有这个功能:

...    
public static void XXX()
{
}
...

在主工程中,同Framework 4.6.1,我在一个Winform

using BusinessLayer.LocalStorage;

在 Load 中我写了函数但是引用不被识别:

我必须在之前添加LocalStorage:

LocalStorage.LocalStorage.XXX();

这样调用就可以了

为什么使用 LocalStorage.XXX() 不起作用?我在 using 子句中声明了我的命名空间。然后应该可以工作了。

我在 BusinessLayer 项目的目录中有 class,因此命名空间应该是 BusinessLayer.LocalStorage

代码是:

namespace BusinessLayer.LocalStorage 
{
  public class LocalStorage 
  {
     ...
     public static void XXX() 
     {
     }
     ...
  }
}

Visual studio 根据解决方案中 class 的当前位置自动生成命名空间。当您创建一个新的 class 时,它首先采用项目的名称。然后它获取 class 所在的当前文件夹。它将继续将文件夹名称附加到命名空间,直到到达 class 名称本身。

例如,如果您有一个名为 ExampleProject 的项目,有一个名为 Models 的文件夹,其中有一个名为 BaseModel.cs 的 class,生成的命名空间将为 ExampleProject.Models

确保包含 XXX 的命名空间不是 LocalStorage.LocalStorage 而被称为 BusinessLayer.LocalStorage。您可以将此命名空间更改为您想要的任何名称并重建您的项目。

这是因为 LocalStorage 不明确,它可能是命名空间 LocalStorage 或 class LocalStorage。您可以通过 3 种方式解决此问题:

  1. 完全删除命名空间 LocalStorage 并将其中的所有内容移动到 BusinessLayer 命名空间

  2. 将 class LocalStorage 重命名为其他名称

  3. using LocalStorage = BusinessLayer.LocalStorage.LocalStorage 添加到您需要使用 class LocalStorage

    的文件顶部

编辑:选项 4。如果您迫切希望保持目录结构与现在一样(使用 LocalStorage 目录),您也可以告诉 Visual Studio目录 LocalStorage 不是名称空间提供程序。您可以通过在解决方案资源管理器中编辑文件夹的属性来完成此操作

虽然不建议命名空间结构和对象名相同,很多情况下会出错,但是从你的评论中我看出你想这样使用

我不建议你像命名空间一样命名 class,参见 this article

我会推荐 <XYZ>LocalStorage.cs

我不知道你的层结构,但是你可以把它称为LocalStorage.XXX(),结构如下。

业务层结构:

本地存储Class:

namespace BusinessLayer.LocalStorage
{
    public  class LocalStorage
    {
        public static void XXX()
        {
        }
    }
}

最后,在winForm中引用了BusinessLayer之后,就可以在Load方法中调用了,如下所示。

using System;
using BusinessLayer.LocalStorage;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LocalStorage.XXX();
        }
    }
}

或者,如果您不想在 BusinessLayer 结构中使用文件夹,您可以使用如下相同的命名空间 (namespace BusinessLayer.LocalStorage) 使用它。