Путаница в структуре пространства имен C # - PullRequest
5 голосов
/ 22 сентября 2011

Меня немного смущает структура пространства имен в C # Я новичок в C # и WPF

Когда я создаю новый проект WPF, по умолчанию эти пространства имен включаются в начало

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

Я смущен пониманием их структуры.Я понимаю, что

using System;

Означает, что я имею в виду пространство имен системы

Но как насчет других, таких как

using System.Text;

Что это значит?

  • Я получаю доступ к одному пространству имен с именем "System.Text"?
  • или я получаю доступ к пространству имен "Text", вложенному в пространство имен "System"?

Также, если «Текст» вложен в «Систему», почему только «использование Системы» включает все пространства имен?мы должны явно включить каждое пространство имен, которое мы используем?

Ответы [ 5 ]

17 голосов
/ 22 сентября 2011

Означает ли using System.Text;, что я использую одно пространство имен с именем «System.Text» или что я использую пространство имен «Текст», вложенное в пространство имен «Система»?

Последний.Вы используете пространство имен «Текст», вложенное в пространство имен «Система».

Обратите внимание, что когда вы говорите

namespace Foo.Bar.Blah
{
    class C 
    {
    ...

, это просто краткий способ записи

namespace Foo
{
    namespace Bar 
    {
        namespace Blah
        {
            class C 
            {
            ...

Пространства имен имеют только «простые» имена.

если у нас есть явная директива 'using' для каждого пространства имен, которое мы используем?

Как правило, да, да.В некоторых ситуациях вы можете этого не делать.Например, если у вас есть два пространства имен, которые оба содержат тип с одним и тем же именем, и вы хотите использовать типы из обоих пространств имен;в этом случае может быть слишком запутанным иметь «использование» двух пространств имен.Кроме того, «использование» вводит методы расширения в игру;если есть методы расширения, которые вы не хотите связать, не включайте пространство имен, в котором они содержатся.

, если «Текст» вложен в «Систему», почему только«Использование системы» включает в себя все пространства имен?

Я не понимаю вопроса, как он сформулирован.Я думаю, может быть, вы спрашиваете:

Почему using System; не делает простое имя Text преобразованным во вложенное пространство имен?

То есть, почему это не работает:

namespace Foo
{
    namespace Bar
    {
         class Blah {}
    }
}

В другом файле:

using Foo;
class Abc : Bar.Blah {}

using Foo; включает только types объявлены непосредственно внутри Foo.Он не содержит пространств имен , объявленных непосредственно внутри Foo.Разработчики C # думали, что слишком сложно вводить пространства имен «в область видимости», как это;обычно люди используют директивы using, чтобы "* охватить" типов .

5 голосов
/ 22 сентября 2011

Пространства имен, по большому счету, не иерархичны по своему значению для компьютера. Типы в System.Text (например, System.Text.StringBuilder): , а не , которые считаются в System - поэтому вам нужно будет перечислить их отдельно, если вы хотите, чтобы типы из обоих:

using System;
using System.Text;

Единственный раз, когда они рассматриваются как иерархия в том, что касается компилятора - о чем я могу подумать в любом случае - это когда речь идет о пространстве имен, вы объявляете что-то в:

namespace Foo.Bar.Baz
{
    class Test
    {
    }
}

В Test все равно, что вы импортировали Foo, Foo.Bar и Foo.Bar.Baz.

Теперь, конечно, пространства имен do образуют иерархии с точки зрения человеческого понимания - облегчают поиск вещей. Но компилятор и среда выполнения в целом не используют этот иерархический взгляд на вещи.

1 голос
/ 22 сентября 2011

должны ли мы явно включать каждое используемое нами пространство имен?

Да или полностью определять имена типов.

2 использования пространства имен

using System;
using System.Text;

полностью независимы.Их имена предполагают связь, но извне тех пространств имен, которые можно считать символическими.

Вы не можете использовать элементы System.Text, когда вы используете только первое.
И вам не нужно первое вДля того, чтобы использовать второй.

Только когда вы пишете код, принадлежащий вложенному пространству имен, вы видите некоторый эффект.

namesapce A
{
    namespace B
    {
        class Foo { }
    }

    namespace C
    {
        class Bar { private B.Foo f; }  // B is a 'relative' ns
    }
}
0 голосов
/ 22 сентября 2011

Вы получаете доступ к пространству текстовых имен, вложенному в пространство системных имен.И да, вам нужно включить каждое используемое пространство имен.

Структура пространства имен может выглядеть примерно так:

namespace Parent
{
    namespace Child
    {
        public class ChildClass
        {
        }
    }
}
0 голосов
/ 22 сентября 2011

using System.Text импортирует все объявления внутри System.Text, но ничего в его папках. Нет System.Text.* эквивалента, как в Java , как в воображаемом языке.

Простой способ справиться с пространствами имен - просто написать свой код нормально и с помощью CTRL +. над неопределенными ключевыми словами, чтобы VS.NET автоматически добавила ссылку using для вас.

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