#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 способами:
LocalStorage
Полностью удалите пространство имен и переместите все в нем внутриBusinessLayer
пространства имен- Переименуйте класс
LocalStorage
во что-нибудь другое - Добавьте
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
), что и ниже.