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

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

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

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

Ответы [ 61 ]

170 голосов
/ 17 марта 2009

C # - это язык, который используется вместе с CLR.

string является типом в C #.

System.String является типом в CLR.

При использовании C # вместе с CLR string будет сопоставлен с System.String.

Теоретически, вы можете реализовать C # -компилятор, который генерирует Java-байт-код. Разумная реализация этого компилятора, вероятно, будет отображать string в java.lang.String для взаимодействия с библиотекой времени выполнения Java.

156 голосов
/ 15 января 2014

Это видео на YouTube демонстрирует, насколько они отличаются.

Но теперь для длинного текстового ответа.

Когда мы говорим о .NET, есть две разные вещи: одна - это .NET framework, а другая - языки (C#, VB.NET и т. Д.), Которые используют эту среду.

enter image description here

"System.String" a.k.a "String" (заглавная "S") - это тип данных .NET Framework, а "string" - это тип данных C#.

enter image description here

Короче говоря, «String» - это псевдоним (то же самое, что называется с разными именами) «string». Таким образом, технически оба приведенных ниже кода дают одинаковый вывод.

String s = "I am String";

или

string s = "I am String";

Таким же образом существуют псевдонимы для другого типа данных c #, как показано ниже: -

объект: System.Object, строка: System.String, bool: System.Boolean, байт: System.Byte, sbyte: System.SByte, short: System.Int16 и т. Д.

Теперь вопрос на миллион долларов с точки зрения программиста. Так когда же использовать «String» и «string»?

Во-первых, чтобы избежать путаницы, используйте одно из них последовательно. Но с точки зрения передового опыта, когда вы делаете объявление переменной, лучше использовать «string» (маленькие «s»), а когда вы используете его в качестве имени класса, тогда «String» (заглавная «S») предпочтительнее.

В приведенном ниже коде левая часть представляет собой объявление переменной, и она объявляется с использованием «строки». С правой стороны мы вызываем метод, поэтому «String» более разумно.

string s = String.ToUpper() ;
148 голосов
/ 10 августа 2008

Нижний регистр string - псевдоним для System.String. Они одинаковы в C#.

Спорят о том, следует ли вам использовать типы System (System.Int32, System.String и т. Д.) Или C# aliases (int, string и т. Д.) Я лично считаю, что вы должны использовать C# aliases, но это только мое личное предпочтение.

145 голосов
/ 18 октября 2008

string это просто псевдоним для System.String. Компилятор будет относиться к ним одинаково.

Единственное практическое отличие - это выделение синтаксиса, как вы упомянули, и то, что вы должны написать using System, если вы используете String.

130 голосов
/ 18 октября 2008

Оба одинаковы. Но с точки зрения правил кодирования лучше использовать string вместо String. Это то, что обычно используют разработчики. например вместо Int32 мы используем int, так как int является псевдонимом Int32

FYI «Строка ключевого слова - это просто псевдоним для предопределенного класса System.String.» - C # Language Specification 4.2.3 http://msdn2.microsoft.com/En-US/library/aa691153.aspx

110 голосов
/ 19 октября 2008

Как говорят другие, они одинаковы. Правила StyleCop по умолчанию заставляют вас использовать string в качестве передовой практики стиля кода C #, за исключением случаев обращения к System.String статическим функциям, таким как String.Format, String.Join, String.Concat и т. Д. ...

91 голосов
/ 22 сентября 2008

Использование типов системы упрощает портирование между C # и VB.Net, если вы занимаетесь такими вещами.

91 голосов
/ 15 января 2015

Новый ответ через 6 лет и 5 месяцев (промедление).

Хотя string - это зарезервированное ключевое слово C #, которое всегда имеет фиксированное значение, String - это просто обычный идентификатор , который может ссылаться на что угодно В зависимости от членов текущего типа, текущего пространства имен и применяемых директив using и их размещения, String может быть значением или типом, отличным от global::System.String.

Я приведу два примера, в которых директивы using не помогут .


Во-первых, когда String является значением текущего типа (или локальной переменной):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

Выше не будет компилироваться, потому что IEnumerable<> не имеет нестатического члена с именем Format, и методы расширения не применяются В вышеупомянутом случае все еще возможно использовать String в других контекстах, где type является единственной возможностью синтаксически. Например, String local = "Hi mum!"; может быть в порядке (в зависимости от пространства имен и директив using).

Хуже того: высказывание String.Concat(someSequence) может (в зависимости от using s) перейти к методу расширения Linq Enumerable.Concat. Это не пойдет на статический метод string.Concat.


Во-вторых, когда String - это другой тип , вложенный в текущий тип:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Ни один из операторов в методе Example не компилируется. Здесь String всегда пианино струна , MyPiano.String. Никакого члена (static или нет) Format на нем не существует (или он унаследован от своего базового класса). И значение "Goodbye" не может быть преобразовано в него.

83 голосов
/ 31 мая 2011

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

78 голосов
/ 21 октября 2011

string - это псевдоним (или сокращение) System.String. Это означает, что, набрав string, мы имели в виду System.String. Вы можете прочитать больше в Think Link: 'строка' является псевдонимом / сокращением System.String.

...