В чем разница между строкой и строкой в ​​C #? - PullRequest
5963 голосов
/ 10 августа 2008

Пример ( обратите внимание на регистр ):

string s = "Hello world!";
String s = "Hello world!";

Каковы рекомендации для использования каждого из них? И каковы различия ?

Ответы [ 61 ]

70 голосов
/ 15 января 2012

String (System.String) - это класс в библиотеке базовых классов. строка (нижний регистр) - это зарезервированная работа в C #, которая является псевдонимом для System.String. Int32 vs int похожа на ситуацию Boolean vs. bool. Эти ключевые слова, специфичные для языка C #, позволяют объявлять примитивы в стиле, аналогичном C.

70 голосов
/ 28 января 2011

Я просто хотел бы добавить это к ответу lfousts из книги Ritchers:

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

  • Я видел, что некоторые разработчики были сбиты с толку, не зная, использовать ли string или String в их коде. Потому что в C # строка (ключевое слово) отображается именно на System.String (тип FCL), различий нет, и их можно использовать. Так же, Я слышал, что некоторые разработчики говорят, что int представляет 32-разрядное целое число, когда приложение работает в 32-битной ОС и представляет 64-битное целое число, когда приложение работает на 64-битной ОС. Это утверждение абсолютно неверно: в C # int всегда отображается System.Int32 , и, следовательно, он представляет собой 32-разрядное целое число независимо от ОС код работает Если программисты будут использовать Int32 в своем коде, то этот потенциал путаница также устранена.

  • В C # long отображается на System.Int64 , но на другом языке программирования, long может отображаться на Int16 или Int32 . Фактически, C ++ / CLI обрабатывает long как Int32 . Кто-то, читающий исходный код на одном языке, может легко неверно истолковать намерение, если он или она привыкли к программированию на другом языке программирования. Фактически, большинство языков даже не воспринимают long как ключевое слово и не будут компилировать код который использует это.

  • В FCL есть много методов, имена которых являются частью имен их методов. За Например, тип BinaryReader предлагает такие методы, как ReadBoolean , ReadInt32 , ReadSingle и т. Д., А тип System.Convert предлагает такие методы, как ToBoolean , ToInt32 , ToSingle и так далее. Хотя это законно, чтобы написать следующее код, строка с float кажется мне очень неестественной, и не очевидно, что строка правильно:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • Многие программисты, использующие исключительно C #, склонны забывать, что другие программы языки могут использоваться против CLR, и из-за этого C # -измы проникают в код библиотеки классов. Например, FCL Microsoft почти исключительно написан на C # и разработчики из команды FCL теперь внедрили в библиотеку такие методы, как Array 's GetLongLength , который возвращает значение Int64 , которое long в C #, но не на других языках (например, C ++ / CLI). Другой пример: System.Linq.Enumerable LongCount метод.

Я не получил его мнение, пока не прочитал полный абзац.

64 голосов
/ 24 августа 2012

Опаздываю на вечеринку: я использую типы CLR 100% времени (ну, разве что заставил использовать тип C #, но я не помню, когда это было в последний раз) ,

Изначально я начал заниматься этим несколько лет назад, согласно книгам Ритчи о CLR. Для меня имело смысл, что в конечном итоге все языки CLR должны поддерживать набор типов CLR, поэтому использование типов CLR самостоятельно обеспечивает более четкий и, возможно, более «многократно используемый» код.

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

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

Кроме того, теперь, когда я вижу «int» или «string», мне это просто кажется очень неправильным, как будто я смотрю на C-код 1970-х годов.

64 голосов
/ 25 апреля 2011

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

59 голосов
/ 18 августа 2008

Это вопрос соглашения, правда. string просто больше похоже на стиль C / C ++. Общее соглашение состоит в том, чтобы использовать любые ярлыки, которые предоставил выбранный вами язык (int / Int для Int32). Это относится и к «объекту», и к decimal.

Теоретически это может помочь перенести код в какой-то будущий 64-битный стандарт, в котором "int" может означать Int64, но это не главное, и я ожидаю, что любой мастер обновления изменит любые int ссылки на Int32 В любом случае, чтобы быть в безопасности.

47 голосов
/ 15 января 2012

Разницы нет.

Ключевое слово C # string соответствует типу .NET System.String - это псевдоним, который соответствует соглашениям об именах языка.

Аналогично, int отображается на System.Int32.

42 голосов
/ 01 ноября 2013

По этому вопросу есть цитата из книги Дэниела Солиса .

Все предопределенные типы отображаются непосредственно в базовые типы .NET. Имена типов C # (строка) являются просто псевдонимами для Типы .NET (String или System.String), поэтому использование имен .NET прекрасно работает синтаксически, хотя это не рекомендуется. В программе C # вы должны использовать имена C # вместо имен .NET.

40 голосов
/ 11 июня 2014

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

String не является ключевым словом, и вы можете использовать его в качестве идентификатора:

Пример

string String = "I am a string";

Ключевое слово string является псевдонимом для System.String помимо проблемы с ключевыми словами, они точно эквивалент.

 typeof(string) == typeof(String) == typeof(System.String)
38 голосов
/ 08 октября 2012

Да, между ними нет разницы, точно так же как bool и Boolean.

33 голосов
/ 24 августа 2011

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

...