Почему директива «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 including, включая проприетарный исходный код, секретный исходный код, военный исходный код и так далее.
Йорг Миттаг

@ 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.