Пространство имен с тем же именем, что и имя класса

#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 { ... }
}
  

В противном случае это просто невозможно