Подтвердить что ты не робот

Почему С# определяет два разных использования для `use`?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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