Члены вложенного пространства имен - PullRequest
3 голосов
/ 17 июля 2010

Если namespace A2 вложено в namespace A1, то A2 является членом включающего A1.Но члены A2 (то есть типы, объявленные в A2) не являются членами A1.

a) Что именно подразумевается под членами A2, не являющимися членами A1?Другими словами, что было бы иначе, если бы они были также членами A1?Возможно, что внутри A1 нам не пришлось бы использовать полностью определенное имя для типов, определенных в A2?

b) Что именно означает пространство имен A2, являющееся членом A1?

Кстати - я понимаю пространства имен, меня просто смущает терминология, используемая моей книгой (а именно, А2 является членом А1 и т.д.)

спасибо

РЕДАКТИРОВАТЬ

1) По сути, A2 член A1 является причиной, по которой внутри A1 нам не нужно указывать A1. prefixпри ссылках на типы, объявленные в A2:

namespace A1
{
    class Program
    {
        static void Main(string[] args)
        {
            A2.classA2 a2= A2.classA2(); //here we don't need to include A1.
                                           prefix
        }
    }

    namespace A2
    {
       class classA2 { }
    }
}

2) В assembly asmLibrary.dll

namespace A
{
    public class A1{}


    namespace B
    {
        public class B1{}
    }
}

определяется следующее приложение App1 также имеет ссылку на сборку asmLibrary.dll:

namespace A
{
    class Program
    {
        static void Main(string[] args)
        {
            B.B1 instanceB1 = new B.B1();
        }
    }
}

Следующее приложение App2 имеет ссылку на сборку asmLibrary.dll:

using A;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            A.B.B1 bInstance = new A.B.B1(); 

            A1 a1 = new A1();
        }
    }
}

a) Когда мы попытались объявить в App2 экземплярA.B.B1, нам нужно было указать полное имя типа.Но с App1 нам было разрешено указать тип через B.B1.Таким образом, почему нам было разрешено пропустить префикс A. внутри App1, но не внутри App2 (App2 имеет директиву using A;, поэтому его поведение должно быть таким же, как у App1)?

b) Кроме того, если namespace B является членом namespace A, тогда App2 не должно позволять нам объявлять тип A.B.B1 с использованием синтаксиса B.B1 instanceB1 = new B.B1();?!

Ответы [ 4 ]

3 голосов
/ 17 июля 2010

Рассмотрим следующее

namespace A1
{
    namespace A2  // A1.A2
    {
        class C2  // full name: A1.A2.C2
        {
            private A1.C1 c1b;   // full name 
            private C1 c1b;      // shortest form. A1 is in scope here
        }
    }

    class C1   // full name: A1.C1
    {
        private A1.A2.C2 c2a;   // full name
        private A2.C2 c2b;      // shortest form. We can omit the A1 prefix but not A2
    }
}

Ответы

a) класс C2 не является (прямым) членом A1, поэтому вне пространства имен A2 мы должны объявить
это как A2.C2 c2b;

b) Члены A1 находятся в области видимости внутри A2, см. Объявление C1 c1b;


Отредактируйте:

Ваш пример показывает различные эффекты using a; ... и namespace A { ... }.

Операторы using 'импортируют типы из A (& sect; 16.3.2) ', а в App2 код равен внутри пространства имен.
Термин «член» может быть немного запутанным здесь.

1 голос
/ 17 июля 2010

Насколько я понимаю, у IL нет понятия пространства имен. Компилятор добавляет имена пространств имен и имен типов для создания более длинных полных имен; например, класс Customer в пространстве имен MyCompany.MyProduct будет скомпилирован как MyCompany$MyProduct$Customer при компиляции в IL. Для виртуальной машины IL это имя типа; тот факт, что он содержит $ знаков, не имеет значения.

Из этого факта вы можете сделать свои собственные выводы. : -)

1 голос
/ 17 июля 2010
  • Что именно подразумевается под пространством имен A2, являющимся членом A1?

Значение члена описано в спецификации C #, раздел 3.4:

Пользователи

Пространства имен и типы имеют членов. Члены сущности, как правило, доступны посредством использования квалифицированного имени, которое начинается со ссылки на сущность, за которой следует маркер «.», За которым следует имя члена.

Члены типа либо объявляются в объявлении типа, либо наследуются от базового класса типа. [...]

Определение «членов пространства имен» дано в разделе 3.4.1:

члены пространства имен

[...]

Пространства имен и типы, объявленные в пространстве имен, являются членами этого пространства имен.

  • Что именно подразумевается под членами А2, не являющимися членами А1?

Это означает, что если A1.A2.Foo работает, это не значит, что A1.Foo также работает.

1 голос
/ 17 июля 2010

Члены А2 являются членами А2 - «доллар останавливается там». Если А1 содержал определения членов А2, то ничего не изменится - в любом случае вам нужно будет ссылаться на этих членов как A1.member, а члены A2 - как A1.A2.member - если только у вас нет операторов using, в этом случае вы Вам нужно будет осторожно действовать, если вы хотите избежать ошибок компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...