Использование встроенных пространств имен в C # - PullRequest
1 голос
/ 10 июня 2009

Сценарий:

Предположим, я хочу определить свой собственный класс.

public class Person
{
}

Я хочу поместить его в систему имен.

Примечание: я не включил директиву 'using System' вверху.

namespace System
{
    public class Person
    {
        public void Display()
        {
            Console.WriteLine("I am mine");
        }
    }
} 

Хотя я не включил директиву using System; вверху, я все еще могу получить доступ к System.Console.WriteLine в моем методе, поскольку мое объявленное пространство имен - System.

Как это возможно? как это происходит?

Ответы [ 6 ]

8 голосов
/ 10 июня 2009

Если вы объявляете пространство имен Foo.Bar.Baz, каждое пространство имен в этой иерархии (Foo, Foo.Bar и Foo.Bar.Baz) ищется при обращении к типу из этого объявления пространства имен:

namespace Foo.Bar.Baz
{
    class Test
    {
        static void Main()
        {
            // This will search for Foo.Bar.Baz.SomeType,
            // Foo.Bar.SomeType, Foo.SomeType, SomeType,
            // in that order
            SomeType.StaticMethod();
        }
    }
}

См. Раздел 3.8 спецификации языка C # 3.0 для подробностей.

Тем не менее, я надеюсь, что вы не всерьез рассматриваете возможность использования этого как способа избежать добавления директив использования. Создание собственных типов в иерархии пространства имен System - очень плохая идея.

1 голос
/ 10 июня 2009

Поскольку вы определили свой тип в пространстве имен System, у вас есть доступ ко всем другим типам, определенным в пространстве имен System.

Аналогично, если бы вы определили свой класс в System.Data, у вас был бы доступ к System и System.Data без необходимости явного использования операторов.

Пространства имен могут дублироваться в сборках.

Обратите внимание, что определение вашего типа в одном и том же пространстве имен не дает вам доступа к внутренним членам типов, определенных в одном и том же пространстве имен, но в другой сборке.

1 голос
/ 10 июня 2009

Вам не нужна директива using внутри одного и того же пространства имен.

Если вы объявляете свои классы в System, тогда "using System;" неявный.

Тем не менее, это, вероятно, не то место, где вы должны ставить свои классы.

0 голосов
/ 10 июня 2009

Это потому, что вы объявили свой класс как часть пространства имен, и поэтому он автоматически включает сборку для него.

Таким же образом любой файл в пространстве имен проекта не должен объявлять его как использующее это пространство имен проекта.

0 голосов
/ 10 июня 2009
0 голосов
/ 10 июня 2009

Все, что объявлено внутри пространства имен, имеет доступ ко всем другим классам в этом же пространстве имен (при условии, что у вас есть ссылка на сборку, содержащую это пространство имен и эти классы).

...