Почему в C # учитывается регистр?

Какие доводы стоят за чувствительностью к регистру в C #?

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

[ОБНОВЛЕНИЕ] Я сделал решительный шаг три дня назад. Изучение C # не было особенно сложным, хотя я едва мог вспомнить свои дни C ++ в конце 90-х.

Меня раздражает чувствительность к регистру? не так много, как я думал ... плюс я считаю, что это действительно выгодно. Я действительно доволен CCR как моделью асинхронного координационного программирования. Если бы у меня было больше времени на текущий проект, я бы портировал кодовую базу на C #, чтобы в полной мере воспользоваться преимуществами. Однако было бы несправедливо по отношению к моему клиенту.

Сейчас я оцениваю свой текущий проект и ВЕЗДЕ вижу блокирующие потоки! Аааа !!!

[ОБНОВЛЕНИЕ]

Ну, я программировал на C # уже почти год. Мне очень нравится язык, и я действительно ДЕЙСТВИТЕЛЬНО ненавижу переход на VB (особенно когда это неизбежно!)

А что касается чувствительности к регистру? даже не проблема


person Andrew Harry    schedule 30.01.2009    source источник
comment
О чем они думали? превращает плохой вопрос в флеймбейт.   -  person Serafina Brocious    schedule 30.01.2009
comment
Что сказал Коди Броусиус.   -  person Shog9    schedule 30.01.2009
comment
Гарри, это правильный вопрос. Почему бы не отредактировать его до закрытия и смягчить язык, чтобы он не закрывался как субъективный и аргументативный. По сути, сделайте то, что предложил Коди ;-)   -  person JoshBerke    schedule 30.01.2009
comment
Кроме того, спасибо за все те голоса против :)   -  person Andrew Harry    schedule 30.01.2009
comment
люди просто слишком сумасшедшие, когда вы осмеливаетесь задавать вопросы святому богу, известному как Чувствительность к регистру, - лучшее, что можно сделать, если вы умный человек. Я проголосовал за вас, не беспокойтесь обо всех этих сверхчувствительных людях ...   -  person csmba    schedule 12.11.2009
comment
+1 за наступление на святую землю! Я с тобой, брат. Я не вижу абсолютно никаких причин, по которым C # должен учитывать регистр, если он имеет ту же поддержку IDE, что и VB. Как сказал Гансельман: «Если бы у меня была монета за каждый раз, когда меня укусила чувствительность к регистру или нечувствительность к регистру, я бы получил семь или восемь долларов». Серьезно ... Тебя только что укусили фанатики, которые думают, что тебе не стоит подвергать сомнению спецификацию. Кроме того, говорить, что он должен быть чувствительным к регистру, потому что он основан на C ++, просто возмутительно. Учитывая новый DLR, чувствительность к регистру будет нестабильной. Попробуйте кодировать на php несколько дней и посмотрите, каково это!   -  person EightyOne Unite    schedule 26.07.2010


Ответы (14)


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

Я также хотел бы отметить, что это очень правильный вариант использования:

public class Child
{
   private Person parent;
   public Person Parent
   {
      get { return parent;}
   }
}

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

person JoshBerke    schedule 30.01.2009
comment
Причина в наследовании? Шутки в сторону? - person Andrew Harry; 30.01.2009
comment
Кто что сказал о наследовании? У вас есть свойство Parent в классе с частным полем parent. Это не по наследству. Я использовал Child Parent как в kid и их Parent. Думаю, я спал рядом с моими детьми и дал мне это в качестве образца. - person JoshBerke; 30.01.2009
comment
C # чувствителен к регистру, потому что он следует после наследования языков в стиле C - person Andrew Harry; 30.01.2009
comment
О, да, я понял. Да, потому что они хотели, чтобы C # обратился к разработчикам C / C ++ и Java, которые чувствительны к регистру. Думаю, это было правильное решение. Если вы имитируете синтаксис и грамматику языка, вам следует постараться сохранить их как можно ближе, чтобы упростить переход. - person JoshBerke; 30.01.2009
comment
У вас нет раздувания переменной длины. aVar отличается от AVAR, отличается от AVAR. - person Calyth; 30.01.2009
comment
Плохая практика - использовать имена, которые различаются только регистром. Смотрите мой ответ на этот вопрос. - person Tom A; 14.02.2009
comment
@Tom Я согласен, я предпочитаю использовать префиксы для своих переменных-членов и не отличать их от случая к случаю, хотя у меня будет параметр метода в нижнем регистре, например, когда конструктор настраивает свойства объекта. - person JoshBerke; 15.02.2009
comment
@ Джош: Да, в этом есть смысл. Функция рефакторинга Visual Studio под названием Encapsulate делает это очень простым в использовании. Определите поле члена с именем _stuff, и Encapsulate создаст для него свойство с именем Stuff. - person Tom A; 15.02.2009
comment
@Tom: AFAIK это только для публичных участников. Это нормально, если локальные переменные различаются регистром, но это нехорошо. - person Joan Venge; 18.09.2010
comment
если бы это не было чувствительно к регистру, миграция устаревшего кода была бы кошмаром ... ну ладно, больше похоже на головную боль. Потому что Java, C ++ и C чувствительны к регистру. Во всяком случае, чувствительность к регистру отличная! вы можете использовать переменные с одинаковыми именами, но разными переменными. - person ycomp; 21.11.2014

Они, вероятно, думали, что «мы не хотим, чтобы люди использовали СМЕВАРИЯ в одном месте, а НЕКОТОРЫЕ - в другом.

person Spencer Ruport    schedule 30.01.2009
comment
VB.net автоматически исправляет ваш случай использования, чтобы отразить оригинал, что обеспечивает гораздо лучшую согласованность - person Andrew Harry; 30.01.2009
comment
Гм, нет. VB.net ничего подобного не делает - это делает ваша IDE. - person Serafina Brocious; 30.01.2009
comment
хорошо, достаточно честно :) Иногда трудно разделить IDE и Language. Язык может этого не делать, но мой "опыт" (IDE) языка таков - person Andrew Harry; 30.01.2009
comment
Что ж, у вас будет такой же опыт работы с C # или любым другим языком в Visual Studio. - person Serafina Brocious; 30.01.2009
comment
Тот факт, что компилятор позволяет это, означает, что он где-то появится, несмотря на достойные IDE. Или вы можете просто взглянуть на сценарии ASP. - person Spencer Ruport; 30.01.2009
comment
@CodyBrocious, как реагирует автоматическая коррекция регистра VS, когда у вас есть две переменные - одна называется PDFWriter, другая - pdfWriter - и вы набираете pdfwriter (все в нижнем регистре)? Как он решает, что вы имеете в виду, и вызывает ли это раздражение или даже затрудняет поиск ошибок? - person ingredient_15939; 10.10.2013
comment
@ ингредиент_15939 - Я видел много плохого кода, но удивительно, что люди, кажется, понимают, что чувствительность к регистру - это не приглашение к созданию двух переменных с одинаковыми именами, потому что я могу. Однако иногда, когда вы пишете конструктор класса, может возникнуть конфликт между именем члена класса и именем параметра. Однако в этих случаях обычно перед участниками ставится this, чтобы было немного более понятно, что происходит. - person Spencer Ruport; 11.10.2013

Рассмотрим имена переменных в следующем псевдокоде:

class Foo extends Object { ... }
...
foo = new Foo();

Чувствительность к регистру позволяет использовать соглашения, которые используют для разделения имен классов и экземпляров; такие условности вовсе не редкость в мире разработчиков.

person Charles Duffy    schedule 30.01.2009
comment
Да, я делаю это все время! - person Ray Hidayat; 30.01.2009
comment
Вы также можете сделать это в VB.Net, на самом деле из-за языка вам даже не нужно различать регистр (я обычно это делаю, чтобы прояснить). Структура языка позволяет компилятору заранее узнать, берете ли вы экземпляр или объявление класса. - person DarrenMB; 17.09.2013

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

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

Вот почему люди иногда так поступают, и это может иметь смысл:

Foo foo = new Foo();

Я делаю это постоянно, это очень полезно. Если вы подумаете об этом в более полезной ситуации, например:

Image image = Image.LoadFrom(path);

Иногда имеет смысл называть экземпляр так же, как имя класса, и единственный способ отличить их - это регистр. В C ++ чувствительность к регистру становится еще более полезной, но это уже другая история. Я могу уточнить, если вам интересно.

person Ray Hidayat    schedule 30.01.2009
comment
Если вы вызываете переменную типа Foo, как foo, вы также можете назвать ее x; для меня это имеет не меньшее значение. Я предполагаю, что вы в первую очередь используете foo в очень маленькой области видимости блока, главным образом потому, что, если бы она была в гораздо большей области, она имела бы некоторый уровень описательного значения. - person DarrenMB; 17.09.2013

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

person Christian C. Salvadó    schedule 30.01.2009
comment
И вас устраивает эта причина? - person Andrew Harry; 30.01.2009

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

Могли быть веские причины для того, чтобы сделать C чувствительным к регистру, когда он был создан три десятилетия назад, но, похоже, нет никаких записей о том, почему. Джефф Этвуд написал хорошую статью, защищающую эту чувствительность к регистру больше не имеет смысла .

person Jonas Pegerfalk    schedule 30.01.2009
comment
Кто-нибудь еще согласен? - person Andrew Harry; 30.01.2009
comment
Чувствительность к регистру - одна из вещей, которая мешает мне больше использовать C #, я нахожу это просто раздражением. - person DarrenMB; 17.09.2013

Вероятно, скопировано с C, C ++, Java и т. Д. Или может остаться таким же специально, чтобы оно было похоже на то, что есть на других языках.

person Bhushan Bhangale    schedule 30.01.2009

Для команды разработчиков языка 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 может облегчить обнаружение. Это не очень важно, и лично я все равно делаю именно то, что я только что сказал, плохо (так что подайте на меня в суд!).

person Tim    schedule 30.01.2009
comment
Вы говорите, что это плохая практика программирования, но я считаю, что она делает код довольно ясным и не требует дополнительных префиксов. Как ты думаешь, почему это плохо? - person Jon Skeet; 30.01.2009
comment
Обновленный ответ, чтобы прояснить себя. - person Tim; 30.01.2009

Синтаксический анализ также немного проще для языков с учетом регистра. Если нет веских причин выбирать способ без учета регистра, зачем беспокоиться?

person Eduard - Gabriel Munteanu    schedule 30.01.2009
comment
Нет, это не так. Имя - это имя, это имя - это имя. Единственный раз, когда это применимо, - это определение ссылок внутри компилятора. Этап парсинга на 100% идентичен. - person Serafina Brocious; 30.01.2009
comment
Не мог ли компилятор просто перейти на source.tolower? (ну, я, очевидно, не знаю синтаксис или что-то еще) - person Andrew Harry; 30.01.2009
comment
Что ж, вы сами ответили на свои сомнения. Когда язык чувствителен к регистру, никаких дополнительных мер не требуется. (Я помню, что сказал немного.) - person Eduard - Gabriel Munteanu; 30.01.2009
comment
Да, они могли, но тогда вы теряете сообщения об ошибках. Эта причина просто неверна, несмотря на то, что чувствительность к регистру - это хорошо (TM). - person Serafina Brocious; 30.01.2009
comment
В ответе я разъяснил свою точку зрения. Соответствующая причина или нет, это было задумано как завершение для других ответов, так как при этом чувствительность к регистру немного упрощает работу, так зачем беспокоиться об обратном? - person Eduard - Gabriel Munteanu; 30.01.2009

Вы смотрите на это очень ограниченно - с вашей точки зрения. Разработчики языков должны учитывать целый ряд других соображений: культурные причины, совместимость с другими языками, распространенные практики кодирования и т. Д.

Все современные языки используют чувствительность к регистру: в каких нет?

Как человек, который использовал BASIC в течение нескольких лет, я очень устал от разработчиков, использующих разные случаи для одной и той же переменной. На такие вещи очень утомительно смотреть, и они поощряют небрежное программирование. Если вы не можете позаботиться о правильном рассмотрении дела - что еще вам не стоит делать?

person Fortyrunner    schedule 30.01.2009
comment
IDE - это не язык. Например: я программирую Java в нескольких IDE, иногда использую Блокнот или Vi (ни одна из которых не поддерживает автокоррекцию). Я хотел бы думать, что однажды мы получим конкурирующую IDE и для языков .NET! - person Fortyrunner; 30.01.2009
comment
Что ж, язык чувствителен к регистру или компилятор? - person Andrew Harry; 30.01.2009
comment
Язык является спецификацией и определяет, что компилятор должен принять. Таким образом, компилятор должен обработать спецификацию языка, что требует учета регистра. Не уверен, почему важен вопрос о компиляторе / языке - person Fortyrunner; 30.01.2009

Из Руководства разработчика .NET Framework Правила использования заглавных букв, чувствительность к регистру:

Правила использования заглавных букв существуют исключительно для облегчения чтения и распознавания идентификаторов. Регистр нельзя использовать как средство предотвращения конфликтов имен между элементами библиотеки.

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

person Tom A    schedule 14.02.2009
comment
Да для всех общедоступных предметов, но внутренние элементы класса могут отличаться в зависимости от случая. - person JoshBerke; 15.02.2009

Мое лучшее предположение относительно того, почему это чувствительно к регистру, было бы потому, что Unix чувствителен к регистру. Деннис Ричи, отец C, также был соавтором Unix, поэтому логично, что язык, который он написал, совпадал с окружающей средой, доступной в то время. C # только что унаследовал это от своего предка. Я думаю, что это было хорошее решение со стороны Microsoft, поскольку пути Windows не чувствительны к регистру.

person Despertar    schedule 26.08.2012

Я предполагаю, что вы хотели бы увидеть такой код:

SomeField=28;
someField++;
somefield++;
SOMEFIELD++;

скомпилировано так, как если бы SomeField в любом варианте корпуса - это одна и та же переменная.

Лично я считаю это плохой идеей. Это поощряет лень и / или беспечность. Зачем правильно закрывать вещь, если это все равно не имеет значения? Ну, раз уж мы это делаем, может быть, компилятор должен разрешить орфографические ошибки, например SoemField++?

person Marc Bernier    schedule 30.01.2009
comment
нет, плохая идея - написать этот код, но если вы его напишете, будет неплохо, если someField и SomeField будут одинаковыми. Это мое мнение, не убивайте меня. - person csmba; 12.11.2009
comment
Марк, очевидно, ты никогда не программировал на VB .NET. IDE исправляет регистр по мере ввода. Итак, если у вас есть Dim myCustomer As New Customer, а затем вы набираете mycustomer.age = 5 в следующей строке, IDE автоматически исправляет его на myCustomer.Age = 5. Это то, что C # часто не может делать, хотя в VS 2008 стало лучше угадывать правильно. - person Ryan Lundy; 12.02.2010
comment
Ваше мнение по поводу орфографических ошибок не имеет значения. Изменение падежа принципиально не меняет слова. Это по-прежнему означает то же самое. Я согласен с использованием соглашений о регистрах для улучшения читабельности, но принудительное применение при компиляции - это просто плохой дизайн. Мало кто станет утверждать, что файловые системы с учетом регистра имеют смысл. Компилятор, чувствительный к регистру, во многом такой же. Вы бы никогда не увидели приведенный вами пример в реальном проекте, поскольку IDE исправила бы его. - person user1751825; 08.04.2017

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

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

person Quibblesome    schedule 30.01.2009