#c#
#c#
Вопрос:
Я подумал, что имеет смысл сделать следующее, но это невозможно, и будет выдана ошибка : The namespace 'foo' already contains a definition for 'bar'
.
namespace foo
{
public class bar { ... }
}
namespace foo.bar
{
public class baz : EventArgs { ... }
}
Каков был бы подходящий способ именования пространства имен для такого случая?
Комментарии:
1. Без практического примера предложения должны будут делать обоснованные предположения, охватывать все потенциальные базы или не быть отличным ответом; по эмпирическому правилу, пространство имен — это категория или обобщение, а класс — конкретная утилита — именование должно отражать это. Например
System.Collections
, пространство имен и классы, такие какSystem.Collections.CollectionBase
. Если было требование для класса с именемCollections
в этом пространстве имен, то что-то еще не так.2. Это более или менее практический пример. Я хочу использовать пользовательский тип, основанный на
EventArgs
, в классеbar
. Должен ли я поместить пользовательский тип в то же пространствоbar
имен, что и?
Ответ №1:
Вы должны понимать, что в контексте CLR не существует такого понятия, как пространство имен. Пространства имен — это чисто языковая функция, которая существует только для упрощения кода, чтобы нам не приходилось всегда читать полные имена классов.
В вашем примере,
namespace foo
{
public class bar { ... }
}
namespace foo.bar
{
public class baz : EventArgs { ... }
}
когда этот исходный код компилируется, IL даже не знает, что существует два пространства имен — foo и foo.bar . Вместо этого он знает только об определениях классов. В этом случае, когда он сталкивается с классом bar, он знает, что у вас есть класс с именем foo.bar
Когда он сталкивается с классом baz, он разрешает полное имя класса как foo.bar.baz
Но если бы это было так, baz должен был быть законно объявлен в определении класса bar, а не в отдельном пространстве имен, как вы сделали здесь .
Ответ №2:
Вам нужно найти другое имя для пространства имен или имени класса. Обойти это невозможно.
Найти подходящее имя сложно, но это можно сделать.
Ответ №3:
Это действительно зависит от того, чего вы пытаетесь достичь. Если вы действительно хотите, чтобы baz находился в пространстве имен foo.bar, потому что оно зависит / тесно связано с bar, вы можете сделать его дочерним классом bar:
namespace foo
{
public class bar
{
public class baz : EventArgs { ... }
}
}
Теперь вы можете создать новый экземпляр как:
var test = new foo.bar.baz();
Комментарии:
1. Это похоже на то, чего я хочу достичь. Будет принято, как только мне разрешат.
Ответ №4:
В пределах одного и того же пространства имен невозможно иметь одно и то же имя класса. Если ваши пространства имен выглядят настолько одинаково, вы, вероятно, хотите, чтобы они находились в одном и том же пространстве имен. Если это не так, вам, вероятно, необходимо пересмотреть логическую классификацию ваших классов в пространствах имен.
Комментарии:
1. Согласен, ‘.’ в пространстве имен обязательно вызовет путаницу в дальнейшем.
Ответ №5:
может быть
namespace foo_bar
{
public class baz : EventArgs { ... }
}
В противном случае это просто невозможно