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

У меня проблема с 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()? Я объявил свое пространство имен в предложениях использования. Тогда должно работать.

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

Код:

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

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

mark barton 21.12.2020 12:04

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

Dave 21.12.2020 12:14

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

Lasse V. Karlsen 21.12.2020 14:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
140
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

MindSwipe 21.12.2020 12:12
Ответ принят как подходящий

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

  1. Полностью удалите пространство имен LocalStorage и переместите все в нем внутрь пространства имен BusinessLayer

  2. Переименуйте класс LocalStorage во что-то другое

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


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

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

Dave 21.12.2020 12:20

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

MindSwipe 21.12.2020 12:24

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

MindSwipe 21.12.2020 13:45

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

Dave 22.12.2020 11:55

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

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

Я бы порекомендовал бы <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 BusinessLayer.LocalStorage), как показано ниже.

Другие вопросы по теме

Похожие вопросы

Могу ли я опубликовать решение .net framework 4.7.1 с помощью команды публикации dotnet в Azure DevOps?
C# Ошибка CS0738, когда класс наследуется от интерфейса и с типом, который наследуется от метода типа интерфейса
Как интегрировать страйп-платеж с пользовательской формой в ASP.NET MVC?
Поскольку мы можем передать целое число со страницы бритвы в контроллер с помощью asp-route-id , как мы можем вместо этого передать строку?
Как сравнить значения двух вложенных и динамических объектов ссылочного типа
Повторяющееся задание Hangfire, время следующего выполнения пусто
Создание дерева из списка ввода, а затем увеличение счетчика в любое время, когда есть дочерний элемент, и получение идентификатора родительского узла?
Сравнить строку [] со строкой [] в цикле for
Десериализовать json со строкой, массивом int — .net core C#
В ASP.NET Core FromHeader вызывает полное чтение Request.Body