Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

C#. В чем разница между вложенными namespace и namespace, составное имя которых включает в себя точки

#c_sharp #namespace


Здравствуйте!

Есть 2 файла:


Nesting.cs:

namespace Demo
{
    namespace NestingNS
    {
        class Nesting
        {
        }
    }
}

NoNesting.cs

namespace Demo.NoNestingNS
{
    class NoNesting
    {
    }
}



В первом файле пространства имен вложены друг в друга, во втором - пространство имен
имеет составной идентификатор (если его так можно назвать).

Вопрос 1: В чем разница между данными объявлениями (кроме названий классов и пространств
имен)? Или 2-ой случай - это некое подобие синтаксического сахара, которое разворачивается
в 1-ый случай?

Вопрос 2: В каких случаях лучше использовать первое объявление и в каких второе?
    


Ответы

Ответ 1



Это синтаксический сахар. Если вы пишете очень большую программу или библиотеку вы можете хотеть чтобы ваш проект описывало пространство Security, но так, чтобы пользователь знал что оно лежит в System. Чтобы сохранить удобную иерархию, чтобы пользователь (другой программист) мог даже без документации посмотреть какие разделы есть в вашей библиотеке.

Ответ 2



Прямой разницы нету. Но для случая «вложенного» объявления вы можете завершить вложенное пространство имён раньше, и начать новое пространство имён: namespace A { namespace B1 { class С1 {} } namespace B2 { class С2 {} } } Кроме того, для случая «вложенного» объявления вы можете вставить дополнительный using внутрь, что даёт интересные эффекты: using System; namespace A { using Console = Tools.Console; namespace B { class Program { static void Main(string[] args) { Console.WriteLine(); } } } } namespace Tools { class Console { static public void WriteLine() => global::System.Console.WriteLine("Снаружи"); } } Это вызовет Tools.Console.WriteLine вместо System.Console.WriteLine. Отличие от помещённого using Console = Tools.Console; на промежуточном уровне и на внутреннем проявляются в случае, если внутри B есть свой класс Console: для кода using System; namespace A { using Console = Tools.Console; namespace B { class Program { static void Main(string[] args) { Console.WriteLine(); } } class Console { static public void WriteLine() => global::System.Console.WriteLine("Внутри"); } } } namespace Tools { class Console { static public void WriteLine() => global::System.Console.WriteLine("Снаружи"); } } будет выведено «Внутри», а не «Снаружи». Это вопрос вкуса. Я бы использовал, если возможно, более короткое объявление, чтобы не загромождать текст программы.

Комментариев нет:

Отправить комментарий