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

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

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

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

Ответы [ 61 ]

26 голосов
/ 03 октября 2012

Один аргумент, не упомянутый в другом месте, предпочитает случай Паскаля String:

System.String является ссылочным типом, а имена ссылочных типов обозначаются в паскале по соглашению .

23 голосов
/ 07 апреля 2015

Оба одинаковы. Разница в том, как вы их используете. Конвенция,

с tring для переменных

S tring для вызова других методов класса String

Как:

string fName = "John";
string lName = "Smith";

string fullName = String.Concat(fName,lName);

if (String.IsNullOrEmpty(fName))
{
  Console.WriteLine("Enter first name");
}
17 голосов
/ 07 марта 2014

Разницы практически нет

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

15 голосов
/ 04 октября 2012

String относится к строковому объекту, который поставляется с различными функциями для управления содержащейся строкой.

string относится к примитивному типу

В C # они оба компилируются в String, но в других языках этого не происходит, поэтому вам следует использовать String, если вы хотите иметь дело с объектами String, и string, если вы хотите иметь дело с литералами.

15 голосов
/ 01 октября 2015

Если действительно полезно увидеть, что между string и System.String нет разницы:

var method1 = typeof(MyClass).GetMethod("TestString1").GetMethodBody().GetILAsByteArray();
var method2 = typeof(MyClass).GetMethod("TestString2").GetMethodBody().GetILAsByteArray();

//...

public string TestString1()
{
    string str = "Hello World!";
    return str;
}

public string TestString2()
{
    String str = "Hello World!";
    return str;
}

Оба выдают одинаковый байтовый массив IL:

[ 0, 114, 107, 0, 0, 112, 10, 6, 11, 43, 0, 7, 42 ]
14 голосов
/ 18 января 2018

Существует одно практическое различие между string и String.

nameof(String); // compiles
nameof(string); // doesn't compile

Это потому, что string - это ключевое слово (в данном случае псевдоним), а String - это тип.

То же самое верно и для других псевдонимов.

| Alias     | Type             |
|-----------|------------------|
|  bool     |  System.Boolean  |
|  byte     |  System.Byte     |
|  sbyte    |  System.SByte    |
|  char     |  System.Char     |
|  decimal  |  System.Decimal  |
|  double   |  System.Double   |
|  float    |  System.Single   |
|  int      |  System.Int32    |
|  uint     |  System.UInt32   |
|  long     |  System.Int64    |
|  ulong    |  System.UInt64   |
|  object   |  System.Object   |
|  short    |  System.Int16    |
|  ushort   |  System.UInt16   |
|  string   |  System.String   |
12 голосов
/ 30 декабря 2014

Вам не нужно import пространство имен (используя System;), чтобы использовать string, потому что это глобальный псевдоним System.String.

Чтобы узнать больше об псевдонимах, вы можете проверить эту ссылку .

10 голосов
/ 08 февраля 2018

Прежде всего, оба (строка и строка) не одинаковы. Есть разница: Строка не является ключевым словом и может использоваться в качестве идентификатора, тогда как строка является ключевым словом и не может использоваться в качестве идентификатора.

Я пытаюсь объяснить другим примером: Во-первых, когда я ставлю "строку s;" в Visual Studio и при наведении на него я получаю (без цвета):
String Definition

Это говорит о том, что строка - это System.String, верно? Документация на https://msdn.microsoft.com/en-us/library/362314fe.aspx. Во втором предложении написано, что «строка - это псевдоним для String в .NET Framework».

8 голосов
/ 11 апреля 2019

@ JaredPar (разработчик компилятора C # и плодовитый пользователь SO!) Написал отличный пост в блоге по этому вопросу. Я думаю, что здесь стоит поделиться. Это хороший взгляд на нашу тему.

string против String - это не дебаты о стиле

[...]

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

Идентификатор String хотя и не имеет конкретного значения в C #. Это идентификатор, который проходит через все правила поиска имен как Widget, Student и т. Д. Он может связываться со строкой или связываться с типом в другой сборке, цели которого могут полностью отличаться от string. Хуже того, это может быть определено таким образом, что код, подобный String s = "hello"; продолжил компиляцию.

class TricksterString { 
  void Example() {
    String s = "Hello World"; // Okay but probably not what you expect.
  }
}

class String {
  public static implicit operator String(string s) => null;
}

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

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

Другой способ визуализировать разницу заключается в следующем примере:

string s1 = 42; // Errors 100% of the time  String s2 = 42; // Might
error, might not, depends on the code

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

[...]

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

Помните, когда вы видите дебаты String против string, речь идет о семантике, а не о стиле. Выбор строки дает четкий смысл вашей кодовой базе. Выбор String не является неправильным, но он оставляет дверь открытой для сюрпризов в будущем.

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

8 голосов
/ 01 февраля 2018

Джеффри Рихтер написал:

Еще один способ думать о том, что компилятор C # автоматически предполагает, что у вас есть следующие using директивы во всех ваших файлы исходного кода:

using int = System.Int32;
using uint = System.UInt32;
using string = System.String;
...

Я видел, что некоторые разработчики запутались, не зная, стоит ли строка или строка в их коде. Потому что в C # строка (ключевое слово) отображает точно в System.String (тип FCL), нет никакой разницы и можно использовать любой из них.

...