Почему C # определяет два разных использования для `using`? - PullRequest
23 голосов
/ 10 марта 2011

Вопрос скорее из любопытства, чем из всего, но почему C # определяет две разные "цели" для ключевого слова using?С одной стороны, это директива ...

, используемая для создания псевдонима для пространства имен или для импорта типов, определенных в других пространствах имен.

С другой стороны, этоутверждение, которое ...

определяет область действия, вне которой будет удален объект или объекты.

Мне кажется, что разные варианты использования одного и того жеключевое слово, но, возможно, я что-то упустил.Есть ли причина, почему это ключевое слово имеет две разные цели?Или обе эти цели, в глубине души компилятора, на самом деле одно и то же?

Ответы [ 3 ]

20 голосов
/ 10 марта 2011

Я задавал Эрику Липперту тот же вопрос в своем блоге несколько лет назад здесь (см. Первый комментарий).

Его ответ был:

Это сложный вопрос языка дизайн; когда одно ключевое слово используется для представляют два совершенно разных понятия, это может быть запутанным. Но введение нового ключевого слова в концепцию заставляет язык чувствовать себя немного раздутым. Я бы лично выбрал «импорт» или некоторый такой синтаксис для директивная форма, чтобы гарантировать, что это не путать с формой заявления, но я понимаю, что это суждение позвонить.

Мы разрабатывали функцию для C # 4.0 который получил сокращение, которое было еще одним форма «частичного» класса; в основном способ обмена метаданными атрибута между машинным и пользовательские половинки частичного учебный класс. Я отодвинулся с помощью ключевое слово "частичное" для функции потому что тогда у нас было бы три тонко разные значения для «частичный» в C #, который я чувствовал, было два Очень много. (Я выступал за добавление другое условное ключевое слово "существующий". К сожалению суть в конечном итоге спорный, так как функция была вырезать из-за нехватки времени.) - Эрик

Для тех, кто не знает, кто такой Эрик, он разработчик для команды компилятора C #.

19 голосов
/ 10 марта 2011

Я не вижу, как эти два использования могут быть одинаковыми в компиляторе.

Я думаю, что причиной двойного использования является просто тот факт, что ключевое слово очень хорошо подходит для обеих целей и нет опасности двусмысленности (одно является директивным, другое - оператором, поэтому они появляются в совершенно ином контексте ). Я думаю, что это прекрасно - язык должен иметь небольшое количество ключевых слов, и их использование должно быть легко понятным - это относится к обоим вариантам использования using.

Как упомянул Linkgorn в комментарии, еще одним примером такой же ситуации является where, который также существует в двух местах (общие ограничения и синтаксис запроса LINQ).

3 голосов
/ 10 марта 2011

Во-первых, они оба соответствуют слову, и, поскольку они не могут использоваться в одном контексте, их нельзя спутать друг с другом.

Причина, помимо любой формулировкипредпочтения, будет количество ключевых слов языка.

Ключевые слова отделены от любых библиотечных классов и тому подобное.Я могу создать метод с именем DateTime, не нарушая и не перекрывая тип DateTime, поскольку я могу просто использовать пространства имен, чтобы указать, какой из них я хочу.Но вы не можете * создать метод или переменную, называемую «public», потому что это ключевое слово языка.

Из-за этого большинство языков стремятся свести количество ключевых слов к минимуму (некоторые даже хвастаются тем, как мало ключевых слов используется.).Каждое слово английского языка, которое используется в качестве ключевого слова, становится недоступным для программиста для других целей.Когда это возможно, лучше повторно использовать существующие ключевые слова, а не окончательно удалять другую страницу из словаря программистов (особенно, если язык уже используется, и в этом случае новое ключевое слово нарушит любой код, который использовал его в качестве идентификатора)

...