#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("Снаружи"); } } будет выведено «Внутри», а не «Снаружи». Это вопрос вкуса. Я бы использовал, если возможно, более короткое объявление, чтобы не загромождать текст программы.
Комментариев нет:
Отправить комментарий