c #: проблемы с пространствами имен

#c# #namespaces #project

#c# #пространства имен #проект

Вопрос:

У меня возникла проблема с Visual Studio 2015 и Framework 4.6.1.

У меня есть бизнес-уровень с этим пространством имен: BusinessLayer.LocalStorage . В этом классе (с именем localStorage) У меня есть эта функция:

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

В основном проекте с той же платформой 4.6.1 у меня есть одна Winform

 using BusinessLayer.LocalStorage;
 

При загрузке я написал функцию, но ссылка не распознается:

введите описание изображения здесь

Я должен добавить localStorage, прежде чем:

 LocalStorage.LocalStorage.XXX();
 

Таким образом, вызов работает

почему не работает использование localStorage.XXX()? Я объявил свое пространство имен в клаузулах using .. Тогда должно работать.

У меня есть класс в каталоге внутри проекта BusinessLayer, поэтому пространство имен должно быть BusinessLayer.localStorage

Код является:

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

Комментарии:

1. Можете ли вы показать код для вашего класса localStorage и вашего основного класса?

2. Помните, что класс находится внутри каталога с именем localStorage, поэтому пространство имен является BussinessLayer . localStorage. Я добавил код класса

3. Полное имя вашего класса есть BussinessLayer.LocalStorage.LocalStorage , и LocalStorage само по себе неоднозначно, LocalStorage.LocalStorage нет. Я бы посоветовал вам переименовать или другое, поскольку наличие пространства имен и класса внутри с одинаковыми именами означает, что нет четкого различия между обязанностями пространства имен (группа функций) и класса (одна часть функциональности).

Ответ №1:

Это связано с тем, что LocalStorage неоднозначно, это может быть либо пространство LocalStorage имен, либо класс LocalStorage . Вы можете решить это 3 способами:

  1. LocalStorage Полностью удалите пространство имен и переместите все в нем внутри BusinessLayer пространства имен
  2. Переименуйте класс LocalStorage во что-нибудь другое
  3. Добавьте using LocalStorage = BusinessLayer.LocalStorage.LocalStorage в начало вашего файла, где вам нужно использовать класс LocalStorage

Редактировать: вариант 4. Если вы отчаянно хотите сохранить структуру каталогов такой, какая она есть сейчас (с каталогом localStorage), вы можете в качестве альтернативы сообщить Visual Studio, что каталог localStorage не является поставщиком пространства имен. Вы можете сделать это, отредактировав свойства папки в обозревателе решений

Комментарии:

1. Я попробовал, мне не нравится идея, потому что я хотел бы использовать только имя класса, когда я вызываю его с помощью clausule using . Было странное поведение. Конечно, он работает с псевдонимом.

2. Основная проблема заключается в том, что у вас есть пространство имен и класс с одинаковым именем, из-за чего компилятор не может понять, что вы имеете в виду в любом заданном месте, поэтому странного поведения нет, только предполагаемое поведение

3. @David Я только что отредактировал свой ответ, чтобы включить четвертый вариант, который может лучше соответствовать вашим потребностям

4. Я буду использовать этот метод, после проверки, что он лучший (это я делал до того, как спросить)

Ответ №2:

Visual studio автоматически генерирует пространства имен на основе текущего местоположения класса в решении. Когда вы создаете новый класс, он сначала принимает имя проекта. Затем он принимает текущую папку, в которой находится класс. он будет продолжать добавлять имя папки в пространство имен, пока не достигнет самого имени класса.

Так, например, если у вас есть проект с именем ExampleProject, с папкой Models, с классом внутри BaseModel.cs, результирующее пространство имен будет ExampleProject.Models

Убедитесь, что пространство имен, содержащее XXX, не является localStorage .localStorage и называется BusinessLayer .localStorage. Вы можете изменить это пространство имен на любое, какое захотите, и перестроить свой проект.

Комментарии:

1. «результирующим пространством имен будет ExampleProject . Модели. BaseModel» на самом деле нет, результирующее пространство имен будет ExampleProject.Models содержать класс BaseModel , к using ExampleProject.Models которому вы получите доступ BaseModel .

Ответ №3:

Хотя структуру пространства имен и имена объектов не рекомендуется использовать одинаково, что во многих случаях приведет к ошибкам, я вижу, что вы хотите использовать его таким образом из сделанных вами комментариев.

Я не рекомендую вам называть класс, подобный его пространству имен, см. Эту статью

Я бы рекомендовал было бы <XYZ>LocalStorage.cs

Я не знаю вашу структуру слоев, но вы можете назвать ее localStorage.XXX () со структурой, подобной приведенной ниже.

Структура бизнес-уровня:

введите описание изображения здесь

Класс локального хранилища:

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

И, наконец, после ссылки BusinessLayer на WinForm вы можете вызвать его в методе 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 ( namespace BusinessLayer.LocalStorage ), что и ниже.

введите описание изображения здесь