Создаем класс вне любого оператора пространства имен в C#

Когда вы создаете класс в C#, Visual Studio автоматически помещает его в оператор пространства имен. Если имя вашего проекта isto_remove_namespace, то по умолчанию это пространство имен isto_remove_namespace.

Но знаете ли вы, что вы можете создавать классы за пределами любого пространства имен? Следующий код показывает файл Person.cs, используемый в этом примере.

namespace howto_remove_namespace
{
    public class Person1
    {
        public string FirstName, LastName;
        public override string ToString()
        {
            return FirstName + " " + LastName;
        }
    }
}

public class Person1
{
    public string FirstName, LastName;
    public override string ToString()
    {
        return "[" + FirstName + " " + LastName + "]";
    }
}

public class Person2
{
    public string FirstName, LastName;
    public override string ToString()
    {
        return "[" + FirstName + " " + LastName + "]";
    }
}

Файл начинается с типичного оператора пространства имен. Внутри пространства имен файл определяет класс Person1 с свойствами FirstName и LastName и метод ToString.

После закрывающей скобки пространства имен файл определяет другой класс Person1. Метод ToString этой версии ставит скобки вокруг имени, поэтому вы можете сказать, что это вторая версия класса.

Файл заканчивается, определяя класс Person2, снова за пределами блока пространства имен.

Если вы используете команду «Обозреватель объектов» меню «Вид», вы можете использовать «Обозреватель объектов» для поиска классов. Если вы ищете Person1, в обозревателе объектов отображается только одна версия класса Person1, и он говорит, что находится в пространстве имен howto_remove_namespace. (Странно, что в обозревателе объектов не отображаются обе версии этого класса.)

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

Обе версии класса, похоже, находятся в одном и том же пространстве имен, что, по вашему мнению, будет конфликтом имен, но C#, похоже, с этим согласен. Если вы запускаете программу с двумя определенными классами, C# использует ту, которая находится внутри блока пространства имен. Если вы удалите эту версию, тогда C# использует другую версию.

Основная программа использует следующий код для демонстрации двух версий класса Person1 и класса Person2.

// Создаем некоторых людей.
private void Form1_Load(object sender, EventArgs e)
{
    Person1 rod = new Person1()
        { FirstName = "Rod", LastName = "Stephens" };
    txtPerson1.Text = rod.ToString();

    Person2 zaphod = new Person2()
        { FirstName = "Zaphod", LastName = "Beeblebrox" };
    txtPerson2.Text = zaphod.ToString();
}

Если вы внимательно посмотрите на картинку в верхней части сообщения, вы увидите, что программа использует первое определение Person1. Он также использует Person2, который не содержится в блоке пространства имен.

Так в чем дело? Если вы много копируете код из одного проекта в другой, как я иногда делаю с этими примерами, вы можете удалить оператор пространства имен из файла, чтобы облегчить копирование кода. Если вы создаете класс Person и удаляете оператор пространства имен из его файла, вы можете скопировать и вставить весь файл в другой проект, и вам не нужно беспокоиться о том, чтобы испортить оператор пространства имен. Без этого утверждения класс получает пространство имен по умолчанию для нового проекта, и все работает отлично.

Это все еще оставляет несколько не отвеченных вопросов. Когда у вас определены обе версии, где та, которая за пределами блока пространства имен? Заменен ли одним внутри пространства имен и, таким образом, недоступен? Есть ли способ явно получить доступ к скрытой версии? Если вы знаете ответ, напишите комментарий.

Источник: csharphelper.com/blog/2017/07/create-a-class-outside-of-any-namespace-statement-in-c/

 

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Adblock
detector