Почему C # чувствителен к регистру?[закрыто]
-
20-08-2019 - |
Вопрос
Какие причины существуют для того, чтобы сделать C # чувствительным к регистру?
Я рассматриваю возможность перехода с VB.NET, чтобы воспользоваться некоторыми возможностями языка (CCR и yield), и понимание причин, лежащих в основе этого различия, может облегчить переход.
[ОБНОВЛЕНИЕ] Ну, я сделал решительный шаг три дня назад.Изучение C # не было особенно сложным, хотя я едва мог вспомнить свои дни на C ++ в конце 90-х.
Меня раздражает Чувствительность к регистру?не так сильно, как я думал...плюс я нахожу, что это действительно выгодно.На самом деле я действительно доволен CCR как моделью асинхронного координирующего программирования.Если бы только у меня было больше времени на текущий проект, я бы портировал кодовую базу на C #, чтобы воспользоваться всеми преимуществами.Хотя это было бы несправедливо по отношению к моему клиенту.
Оцениваю свой текущий проект сейчас, и я вижу блокирующие потоки ПОВСЮДУ!Ааааа!!!
[ОБНОВЛЕНИЕ]
Ну, я программирую на C # уже почти год.Мне действительно нравится язык, и я действительно ненавижу переходить на VB (особенно когда это неизбежно!)
А чувствительность к регистру?даже не проблема
Решение
C # учитывает регистр, потому что он соответствует языкам стиля C, которые все чувствительны к регистру.Это по памяти, вот Ссылка на MSDN что у меня сейчас не работает, я не могу проверить.
Я также хотел бы отметить, что это очень верный вариант использования:
public class Child
{
private Person parent;
public Person Parent
{
get { return parent;}
}
}
Да, вы можете обойти это, используя префиксы в ваших переменных-членах, но некоторым людям не нравится это делать.
Другие советы
Вероятно, они думали: "мы не хотим, чтобы люди использовали someVariable в одном месте и someVariable в другом.
Я думаю, тот факт, что кейс может передавать информацию, является очень веской причиной.Например, по соглашению имена классов, общедоступных методов и свойств начинаются с заглавной буквы по соглашению.И наоборот, поля и локальные переменные начинаются со строчной буквы.
После многолетнего использования языка я пришел к тому, что мне это по-настоящему понравилось: код намного легче читать, когда вы можете считывать информацию просто из оболочки слов.
И вот почему люди иногда так поступают, и это может иметь смысл:
Foo foo = new Foo();
Я делаю это постоянно, это очень полезно.Если вы подумаете об этом в более полезной ситуации, подобной этой:
Image image = Image.LoadFrom(path);
Просто иногда имеет смысл называть экземпляр тем же именем, что и имя класса, и единственный способ отличить их друг от друга - это оболочка.В C ++ учет регистра становится еще более полезным, но это уже другая история.Я могу уточнить, если вам интересно.
Рассмотрим имена переменных в следующем псевдокоде:
class Foo extends Object { ... }
...
foo = new Foo();
Учет регистра позволяет соглашениям, использующим регистр, разделять имена классов и экземпляры;такие соглашения вовсе не редкость в мире разработки.
C # наследует чувствительность к регистру от C и Java, которую он пытается имитировать, чтобы разработчикам было проще переходить на C#
Возможно, были какие-то веские причины для того, чтобы сделать C чувствительным к регистру, когда он был создан три десятилетия назад, но, похоже, нет никаких записей о том, почему.Джефф Этвуд написал хорошую статью , выступающую за это чувствительность к регистру может больше не иметь смысла.
Я думаю, что наличие идентификаторов, чувствительных к регистру, может сделать код более читаемым за счет использования соглашений об именовании, ну, и даже без соглашений об именовании, согласованность, обеспечиваемая чувствительностью к регистру, гарантирует вам, что одна и та же сущность всегда записывается одинаково.
Вероятно, скопировано с C, C ++, Java и т.д.или может быть сохранен таким же специально, чтобы он был похож на то, что есть в других языках.
Это было просто делом вкуса команды разработчиков языка C #.Я готов поспорить, что это было сделано для совместимости с другими языками семейства C.Однако это приводит к некоторым плохим методам программирования, таким как частное поле и его ассоциированное свойство, отличающиеся только в случае первой буквы.
Редактировать:
Почему это может быть сочтено плохим.
class SomeClass
{
private int someField;
public int SomeField
{
get { return SomeField; }
// now we have recursion where its not wanted and its
// difficult for the eye to pick out and results in a
// StackOverflowException.
}
}
Добавление к закрытым полям префикса _ или m может облегчить их определение.Это не имеет большого значения, и лично я сделаю именно то, что я только что назвал плохим (так что подайте на меня в суд!).
Синтаксический анализ также немного проще для языков, чувствительных к регистру.Пока нет веских причин выбирать способ без учета регистра, зачем беспокоиться?
Вы смотрите на это очень ограниченным образом - со своей точки зрения.Разработчики языка должны принимать во внимание совершенно другой набор соображений:культурные причины, совместимость с другими языками, общие методы кодирования и т. Д
Все современные языки учитывают регистр:какие из них этого не делают?
Как человек, который использовал BASIC в течение нескольких лет, я очень устал от разработчиков, использующих разные варианты для одной и той же переменной.На такого рода вещи очень утомительно смотреть и они поощряют небрежное программирование.Если вы не можете побеспокоиться о том, чтобы разобраться в деле правильно - что еще вы не можете побеспокоиться сделать?
От Руководство разработчика .NET Framework Соглашения о капитализации, Чувствительность к регистру:
Правила использования заглавных букв существуют исключительно для того, чтобы упростить чтение и распознавание идентификаторов .Оболочка не может быть использована как средство предотвращения имен конфликтов между элементами библиотеки.
Не думайте, что все языки программирования чувствительны к регистру. языки чувствительны к регистру.Они такие нет.Имена не могут различаться по регистру только.
Мое лучшее предположение о том, почему он чувствителен к регистру, заключается в том, что Unix чувствителен к регистру.Деннис Ритчи, отец C, также был соавтором Unix, поэтому имеет смысл, чтобы язык, который он написал, соответствовал среде, доступной в то время.C # просто унаследовал это от своего предка.Я думаю, что это было хорошее решение со стороны Microsoft, поскольку пути Windows не чувствительны к регистру.
Я предполагаю, что вы хотели бы видеть код, подобный:
SomeField=28;
someField++;
somefield++;
SOMEFIELD++;
скомпилировано так, как если бы someField в любом варианте обсадной колонны было одной и той же переменной.
Лично я считаю, что это плохая идея.Это поощряет лень и / или беспечность.Зачем утруждать себя правильным оформлением вещи, если это все равно не имеет значения?Ну, раз уж мы об этом заговорили, возможно, компилятору следует разрешить орфографические ошибки, например SoemField++
?
Присвоение имен.Имена трудно подобрать, и вы не хотите создавать новое имя, когда говорите о чем-то подобном, или использовать какие-то обозначения, чтобы отделить их друг от друга.
Такие сценарии представляют собой свойства для полей или аргументов в конструкторе, которые вы собираетесь присвоить полям.