【问题标题】:c#: Problems with the namespacesc#:命名空间的问题
【发布时间】:2020-12-21 11:02:30
【问题描述】:

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

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

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

在同Framework 4.6.1的主项目中,我有一个Winform

using BusinessLayer.LocalStorage;

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

我必须在之前添加 LocalStorage:

LocalStorage.LocalStorage.XXX();

这样调用就正常了

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

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

代码是:

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

【问题讨论】:

  • 你能展示你的 LocalStorage 类和你的主类的代码吗?
  • 记住类位于名为 LocalStorage 的目录中,因此命名空间是 BussinessLayer.LocalStorage。我添加了类代码
  • 你班级的全名是BussinessLayer.LocalStorage.LocalStorage,单独LocalStorage是模棱两可的,LocalStorage.LocalStorage不是。我建议您重命名或将另一个重命名为具有命名空间和内部命名相同的类意味着命名空间(功能组)和类(一个功能)的职责之间没有明确的区别。

标签: c# namespaces project


【解决方案1】:

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

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

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

  3. 将using LocalStorage = BusinessLayer.LocalStorage.LocalStorage 添加到您需要使用类LocalStorage 的文件顶部


编辑:选项 4。如果您迫切希望保持现在的目录结构(使用 LocalStorage 目录),您也可以告诉 Visual Studio 目录 LocalStorage 不是命名空间提供者。您可以通过在解决方案资源管理器中编辑文件夹的属性来做到这一点

【讨论】:

  • 我试过了,我不喜欢这个主意,因为我想在使用分句调用它时只使用类名。很奇怪的行为。当然它正在使用别名。
  • 主要问题是你有一个命名空间和一个同名的类,这使得编译器不可能在任何给定的地方知道你的意思,所以没有奇怪的行为,只是故意的行为
  • @David 我刚刚编辑了我的答案以包含第四个选项,它可能更适合您的需求
  • 我会用这个方法,经过测试它是最好的(这是我之前问过的)
【解决方案2】:

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

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

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

【讨论】:

  • "resulting namespace would be ExampleProject.Models.BaseModel" 不是真的,结果命名空间是ExampleProject.Models,其中包含一个类BaseModel,所以using ExampleProject.Models 可以让你访问BaseModel .
【解决方案3】:

虽然不建议命名空间结构和对象名相同,这样很多情况下会导致错误,但是从你做的cmets我看你是想这样用的。

我不建议你像命名空间那样命名一个类,见this article

我会推荐<XYZ>LocalStorage.cs

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

业务层结构:

本地存储类:

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) 来使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2012-10-13
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多