Чому директива "using" і "using" використовують одне і те ж ключове слово в C #?


10

usingДиректива дає нам доступ до типам , не використовуючи їх повністю кваліфіковані імена:

using MyNamespace.Foo.Bar;

usingЗаява діє як синтаксичний цукор для try/ finallyблоків , які забезпечують об'єкти утилізуються належним чином:

using(var x = new MyDisposableClass()) { ... }

Ці дві ситуації, схоже, не мають нічого спільного. Чому вони використовують одне і те ж ключове слово?

Я сумніваюся, що хтось коли-небудь заплутав би два випадки, але здається дивним, щоб не створити нове слово для нового функціоналу.


Як осторонь, я читав і про подвійне використання classв C ++ (один для оголошення класів, інший для визначення параметрів шаблону), але другий випадок зрештою отримав своє ключове слово typename, що для мене має більше сенсу.

Відповіді:


7

Ви маєте рацію в тому, що обидва способи використання usingне пов'язані.

Однак є кілька вагомих причин для використання usingв обох випадках.

  • usingЗаява було створено для .NET 1.0 і має семантичний зміст ( «Я використовую цей простір імен в наступному коді»)
  • В обох випадках usingмає смисловий сенс. Простий англійською мовою ви є usingпростором імен або ви є usingоголошеним одноразовим об'єктом.
  • Перевантажуючи usingключове слово, дизайнерам мови не довелося створювати ще одне зарезервоване слово на мові. Це допомагає зберегти мову чистішою.

Можливо, що, зважаючи на свій час, мовні дизайнери, можливо, вирішили використовувати importдля декларацій простору імен, щоб розмежувати обидва варіанти ( usingодноразовий об’єкт з'явився в більш пізній версії .NET). Ми ніколи не дізнаємось, і це насправді не важливо, оскільки надзвичайно зрозуміло, яке з двох значень ви використовуєте через контекст.

Сказавши все це, не ходіть using MyNamespace.DisposableObject = DisposableObject;скрізь і не записуйте свій код псевдонімами простору імен.


Дякую. Чи можете ви розширити, що ви маєте на увазі під "допомагає зберегти мову чистішою"? На мій погляд, перевантаження ключового слова робить мову менш чистою. Я думаю, було б більш чітко створити нове ключове слово та використовувати окремі ключові слова для окремих функцій.
eigenchris

5
Ключові слова не можна використовувати як ідентифікатори. Введення нового ключового слова розбиває кожну програму, яка трапляється використовувати це ключове слово як ідентифікатор. Ви можете ввести ключове слово у зворотно сумісному випадку, якщо у вас є доступ до кожного рядка вихідного коду, коли-небудь написаного за всю історію C♯, включаючи патентований вихідний код, секретний вихідний код, військовий вихідний код тощо.
Йорг W Міттаг

@ JörgWMittag, Не зовсім правда. C # має цілу купу контекстних ключових слів, які були додані способами, які означали, що існуючі ідентифікатори з цим ім'ям не суперечать коду. varє класичним прикладом, коли названий тип в масштабі varмає перевагу над ключовим словом.
Девід Арно

@ JörgWMittag Або альтернативою є зробити мовну версію компілятора вибірною (наприклад g++ --std=c++11, або дозволити вихідним файлам задавати діалект (як у Haskell (?), Racket, Perl, навіть Python). Мова також може бути розроблена в таким чином, щоб ключові слова ніколи не синтаксично зіткнулися з можливими ідентифікаторами, не зберігаючи деякі ідентифікатори (хоча це може бути складним для вашої реалізації мови відбійних млинів, використовуючи парсер LALR з лексером спереду).
amon

1
@eigenchris Ви завжди можете передувати keword за допомогою символу @, щоб використовувати його як ідентифікатор, наприклад@using
Bill Tür

4

Мовні дизайнери, як правило, намагаються обмежити кількість ключових слів. Якщо ключове слово зарезервоване, воно не може використовуватися як ідентифікатор у коді користувача, що дратує, якщо це лише потрібне вам слово. Це також є перешкодою при перенесенні коду з інших мов - і Microsoft хотіла, щоб люди пересилали код з Java на C #. У C # є більше ключових слів, ніж у Java, але кожне нове ключове слово буде ускладнювати його. Крім того, мови .net призначені для взаємодії з написаними API різними мовами, які можуть не мати однакових ключових слів, що призводить до роздратування, якщо публічний член також є ключовим словом.

Два способи використання usingнеоднозначні, оскільки вони відображаються в позиціях у синтаксисі, "використання" - відповідний термін в обох випадках. Тому є сенс повторно використовувати одне і те ж ключове слово. Ви відзначите інші приклади повторного використання ключових слів, наприклад:

  • new в загальних обмеженнях
  • inв foreachі в параметрах типу варіанту
  • defaultяк пункт в switchі як оператор ( default(T)).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.