Неправильно ли использовать специальные символы в исходном коде C #, например, «ñ»? - PullRequest
26 голосов
/ 12 января 2012

Недавно, используя C #, я только что объявил параметры метода, используя латинский символ ñ, и попытался собрать (скомпилировать) все мое решение, и оно работает, поэтому я смог выполнить свою программу. Но мне любопытно узнать, если неправильно использовать специальные символы, такие как латинские символы, в исходном коде, написанном на C #? Если это неправильно, почему?

Кроме того, что разборчиво и универсально для написания кода на английском языке, есть ли другие причины не использовать специальные символы в исходном коде C #?

Ответы [ 5 ]

23 голосов
/ 12 января 2012

Позвольте мне разбить это на несколько вопросов.

Допустимо ли согласно спецификации использовать нелатинские буквы в идентификаторах C #, строках и т. Д.?

Да, абсолютно. Любой символ, который спецификация Unicode классифицирует как букву, является допустимым. Точную информацию смотрите в спецификации.

Есть ли какие-либо технические проблемы, связанные с нелатинскими буквами в программах на C #?

Да, есть несколько. Как вы, вероятно, знаете, вы можете «статически» и «динамически» связывать код в приложении, а компилятор - это приложение. В прошлом у нас были проблемы, когда у компилятора была статически связанная старая версия алгоритма классификации Unicode, а у редактора была текущая версия с динамической связью, и теперь редактор и компилятор могут не согласиться с тем, что является юридическим письмом, которое может вызвать замешательство пользователя. Однако упомянутые вами акцентированные латинские символы были в стандарте Юникод так долго, что вряд ли могли вызвать какие-либо проблемы.

Более того, многие люди до сих пор используют старомодные редакторы; Я научился программировать в WATCOM еще в конце 1980-х годов и до сих пор часто использую WATCOM VI в качестве своего редактора. Иногда я могу писать код быстрее, чем в Visual Studio, потому что мои пальцы очень хорошо справляются с этим после 23 лет практики. (Хотя в настоящее время я использую Visual Studio практически для всего.) Очевидно, что редактор, написанный в 1980-х, будет иметь проблемы с Unicode.

Есть ли какие-либо нетехнические проблемы, связанные с нелатинскими буквами в программах на C #?

Очевидно, да. Лично я предпочел бы использовать греческие буквы для параметров универсального типа, например:

class List<τ> : IEnumerable<τ>

или при реализации математического кода:

degrees = 180.0 * radians / π;

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

6 голосов
/ 12 января 2012

Добавлен первый бит на основе комментария:

Это не отвечает на вопрос ... ОП не спрашивает, является ли это разрешено (очевидно, это так), но так ли это - Томас Левеск

Хорошо, позвольте мне обратиться к нему более напрямую:

неправильно использовать специальные символы, такие как латинские символы в Исходный код написан на C #? Если это неправильно, почему?

По определению спецификации, оно не является «неправильным» (см. Ниже).

Кроме того, более понятным и универсальным является написание кода на английском языке. есть и другие причины не использовать специальные символы в источнике C # код

Поскольку вы сказали "Кроме того", я не собираюсь затрагивать темы разборчивости или "универсальности" (в любом случае это уместно для вопроса StackOverflow). С другой стороны: «есть ли какая-либо другая причина не использовать специальные символы» ... Поскольку я игнорирую первое, что вы упомянули, я должен сказать, что не могу думать о многих. Единственное, о чем я могу думать, это; У нас все еще (удивительно) есть проблемы с некоторыми инструментами, поддерживающими Unicode сегодня (в основном сторонние инструменты), МОЖЕТ быть, что вы используете какой-то дурацкий инструмент, который неправильно обрабатывает Unicode или не соответствует спецификации C # правильно - но я не встречал ни одного. Так что я бы сказал нет. (Имея в виду, что вы специально сказали, что мне не нужно обращаться к темам с разборчивостью или универсальностью).


Из спецификации C # ECMA Страница 70: ​​

Правила для идентификаторов, приведенные в этом подпункте, точно соответствуют правилам, рекомендованным Стандартным приложением Unicode 15, за исключением это подчеркивание допускается в качестве начального символа (как это традиционно на языке программирования C), разрешены escape-последовательности Unicode в идентификаторах, и символ «@» разрешен в качестве префикса для включения ключевые слова, которые будут использоваться в качестве идентификаторов.

identifier:: 
    available-identifier
    @ identifier-or-keyword

available-identifier::
    An identifier-or-keyword that is not a keyword

identifier-or-keyword::
    identifier-start-character 
    identifier-part-charactersopt

identifier-start-character:: 
    letter-character
    _ (the underscore character U+005F)

identifier-part-characters::
    identifier-part-character
    identifier-part-characters
    identifier-part-character

identifier-part-character:: 
    letter-character
    decimal-digit-character 
    connecting-character 
    combining-character 
    formatting-character

letter-character::
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl
    A unicode-escape-sequence representing a character of classes Lu, Ll, Lt, Lm, Lo, or Nl

Важным моментом является то, что спецификация определила как letter-character.

В частности, включает: A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nl

Упомянутый вами символ ( - ссылка на юникод ) относится к категории "Lu" ( Letter, Uppercase ), что конкретно разрешено спецификацией в идентификаторе.

5 голосов
/ 20 января 2012

Играя дома, я часто назову Func параметры λ, потому что это меня забавляет.

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

С совершенно нормальной латинской буквой, такой как ñ, у меня не было бы никаких сомнений в его использовании, если бы у меня была веская причина для использования заимствованного слова, в котором оно используется.Тем не менее, это никогда не подходит.О единственном заимствованном слове с диакритическим знаком, которое я когда-либо использовал в кодировании, это façade , но оно так долго использовалось в вычислительном контексте и, следовательно, так часто встречается в виде фасад , о котором я думаю фасад как о вычислительном слове, полученном из фасад почти так же, как я думаю о цвет как о вычислительном слове для цвет несмотря на то, что последнее является орфографией, используемой в английском языке, которым я пользуюсь, и, следовательно, будет использовать только фасад и цвет в письменном английском.

3 голосов
/ 12 января 2012

Лично я предпочитаю, когда каждый фрагмент кода / комментария написан только на английском языке. И английский не мой родной язык. Я просто думаю, что для общения лучше, если все пишут код на одном языке.

Это чрезвычайно больно, когда вам приходится переводить - с языка, который вы не знаете ни одного слова - имена переменных или комментарии вокруг отлаживаемого фрагмента кода.

Другое дело, что сам язык написан на английском языке.

Конечно, это личное предпочтение.

0 голосов
/ 12 января 2012

Пока он компилируется, я думаю, что нормально использовать то, что люди, говорящие по-английски, называют специальными символами. Я живу в Швеции, и здесь у нас есть символы ÅÄÖ, которых нет на английском языке. Многие люди используют ÅÄÖ в своих программах, чтобы написать программу, чтобы ее мог понять шведский разработчик. Иногда есть слова, которые не имеют хорошего перевода на английский, и тогда шведское слово является более объяснительным.

...