В чем разница между String и String в C #?

Пример (обратите внимание на случай):

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

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


person Community    schedule 10.08.2008    source источник
comment
@ O.R.Mapper, но факт остается фактом: string - это лексическая конструкция грамматики C #, тогда как System.String - это просто тип. Независимо от каких-либо явных различий, упомянутых в какой-либо спецификации, все же существует это неявное различие, которое может быть учтено с некоторой двусмысленностью. Сам язык должен поддерживать string таким образом, что реализация (совсем) не обязана учитывать это для конкретного класса в BCL.   -  person Kirk Woll    schedule 02.12.2014
comment
@KirkWoll: Согласно спецификации языка, сам язык должен рассматривать string как точно такой же, как тип BCL System.String, и ничего больше. Это совсем не двусмысленно. Конечно, вы можете реализовать свой собственный компилятор, используя грамматику C #, и использовать все найденные подобные токены для чего-то произвольного, не связанного с тем, что определено в спецификации языка C #. Однако полученный язык будет похож только на C #, он не может считаться C #.   -  person O. R. Mapper    schedule 02.12.2014
comment
Вы можете использовать string без директивы using для System. Вы не можете этого сделать с String.   -  person Wilsu    schedule 30.11.2015
comment
читать о боксе / распаковке тоже кстати. - msdn.microsoft.com/en-us/library/yz2be5wk.aspx - Концепция упаковки и распаковки лежит в основе унифицированного представления C # системы типов, в котором значение любого типа может рассматриваться как объект.   -  person George Birbilis    schedule 10.05.2016
comment
Для тех, кто пришел из Algol и Fortran, это обсуждение показывает, что с string что-то не так. Необходимо сократить System.String, но как псевдоним это похоже, но не совсем то же самое. Однако после нескольких лет использования C #, я бы сказал, безопасно просто использовать string и string.Format() и не беспокоиться о System.String.   -  person Roland    schedule 20.12.2016
comment
С 2014 года соглашения в .NET Framework сильно изменились. Теперь при объявлении переменных не существует String (capital s). доступна только строка псевдонима (маленькие буквы). Microsoft может захотеть убрать запутанный подход к программированию!   -  person Sangeeta    schedule 29.11.2018
comment
@Sangeeta Что ты говоришь? Класс System.String все еще существует, и ключевое слово string все еще является его псевдонимом. Так же, как System.Int32 и int. Это буквально одно и то же.   -  person Craig    schedule 08.12.2018
comment
Я не обратил внимания на то, есть ли разница между String и String, и это был хороший вопрос, и он заставил меня узнать что-то полезное, когда я только начал программировать.   -  person elnaz jangi    schedule 12.06.2020
comment
System.String myString = Ха !; @Wilsu Нет? Я только что сделал.   -  person SacredGeometry    schedule 31.12.2020


Ответы (62)


string - это псевдоним в C # для _ 2_.
Технически разницы нет. Это похоже на int vs. System.Int32.

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

e.g.

string place = "world";

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

e.g.

string greet = String.Format("Hello {0}!", place);

Это стиль, который Microsoft обычно использует в своих примерах < / а>.

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

person Community    schedule 10.08.2008
comment
Если вы решите использовать StyleCop и будете следовать этому, это будет означать использование типов, специфичных для языка. Итак, для C # у вас будет строка (вместо String), int (вместо Int32), float (вместо Single) - stylecop.soyuz5.com/SA1121.html - person Dominic Zukiewicz; 23.05.2012
comment
Я всегда использую псевдонимы, потому что я предполагал, что однажды они могут пригодиться, потому что они действуют как абстракция, поэтому их реализации могут быть изменены без моего ведома. - person Rob; 13.10.2012
comment
Visual Studio 2015 говорит, что String.Format следует заменить на string.Format, поэтому я думаю, что Microsoft идет по этому пути. Я также всегда использовал String для статических методов. - person Sami Kuhmonen; 22.12.2014
comment
Что вы скажете на тот факт, что вы можете определить свой собственный тип «String», но не можете сделать то же самое для «string», поскольку это ключевое слово, как описано в stackoverflow.com/questions/7074/ - person jmoreno; 14.10.2020
comment
Тогда я догадываюсь ... Просто будьте последовательны. Используйте строку или строку или используйте конкретную строку в конкретном случае, но всегда в этом случае. - person Rob L; 29.11.2020
comment
Стоит отметить, что string не является псевдонимом для String, а является псевдонимом для global::System.String. Когда вы используете псевдоним, он гарантированно разрешается в системный строковый тип, а не в какой-либо другой класс с именем String. - person John Wu; 13.01.2021

Просто для полноты картины вот свалка соответствующей информации ...

Как отмечали другие, string - это псевдоним для System.String. Предполагая, что ваш код, использующий String, компилируется в System.String (т.е. у вас нет директивы using для некоторого другого пространства имен с другим типом String), они компилируются в тот же код, поэтому во время выполнения нет никакой разницы. Это всего лишь один из псевдонимов в C #. Полный список:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

За исключением string и object, все псевдонимы относятся к типам значений. decimal - это тип значения, но не примитивный тип в среде CLR. Единственный примитивный тип, не имеющий псевдонима, - System.IntPtr.

В спецификации псевдонимы типов значений известны как простые типы. Литералы могут использоваться для постоянных значений любого простого типа; у других типов значений нет доступных буквальных форм. (Сравните это с VB, который допускает DateTime литералов и также имеет для него псевдоним.)

Есть одно обстоятельство, при котором вы должны использовать псевдонимы: при явном указании базового типа перечисления. Например:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

Это просто вопрос того, как спецификация определяет объявления перечисления - часть после двоеточия должна быть продукцией интегрального типа, которая является одним токеном sbyte, byte, short, ushort, int, uint , long, ulong, _21 _... в отличие от продукции type, которая используется, например, в объявлениях переменных. Других отличий это не указывает.

Наконец, когда дело доходит до того, что использовать: лично я использую псевдонимы везде для реализации, но тип CLR для любых API. На самом деле не имеет большого значения, что вы используете с точки зрения реализации - последовательность в вашей команде - это хорошо, но никого больше не волнует. С другой стороны, действительно важно, чтобы, если вы ссылаетесь на тип в API, вы делали это независящим от языка способом. Метод с именем ReadInt32 однозначен, тогда как метод с именем ReadInt требует интерпретации. Например, вызывающий абонент может использовать язык, который определяет int псевдоним для Int16. Разработчики .NET Framework следовали этому шаблону, хорошие примеры - в классах BitConverter, BinaryReader и Convert.

person Community    schedule 18.10.2008

String означает System.String, и это тип .NET Framework. string - это псевдоним на языке C # для System.String. Оба они скомпилированы в System.String на IL (промежуточном языке), поэтому нет никакой разницы. Выберите то, что вам нравится, и используйте это. Если вы пишете код на C #, я бы предпочел string, поскольку это псевдоним типа C # и хорошо известен программистам на C #.

То же самое могу сказать и о (int, System.Int32) и т. Д.

person Community    schedule 18.10.2008
comment
Лично я предпочитаю использовать Int32, поскольку он сразу показывает диапазон значения. Представьте, если бы они обновили тип int в более поздних системах с более высоким битом. 'int' в c, по-видимому, рассматривается как целочисленный тип, с которым целевой процессор наиболее эффективно работает, и определяется как минимум 16-битным. Я бы предпочел здесь предсказуемую последовательность, большое вам спасибо. - person Nyerguds; 28.04.2016
comment
@MyDaftQuestions Я согласен. Во всяком случае, имеет смысл последовательно использовать типы .net, потому что они не знают языка, а тип очевиден, независимо от какого-либо языка (знаю ли я все особенности F # или VB?). - person Peter - Reinstate Monica; 21.01.2017
comment
@Nyerguds Есть две причины не беспокоиться об этом. Во-первых, int определен в спецификации языка C # как 32-битное целое число независимо от оборудования. C #, несмотря на общее наследие в глубине веков, на самом деле не является C. Изменение int на 64-битное целое число было бы серьезным изменением в спецификации и языке. Это также потребует переопределения long, поскольку long в настоящее время является 64-битным целым числом. Другая причина не беспокоиться не имеет значения, поскольку типы никогда не изменятся, но .NET достаточно абстрактна, чтобы в 99% случаев вам все равно не приходилось об этом думать. ;-) - person Craig; 08.12.2018
comment
@Craig Я копаюсь во множестве старых проприетарных игровых форматов, хотя мне действительно приходится думать об этом все время. И тогда использование Int16, Int32 и Int64 является частью более прозрачным в коде, чем использование довольно неописательных short, int и long - person Nyerguds; 09.12.2018
comment
Но short, not, long, float, double и др. описательны, потому что они указаны в спецификации языка. C # - это не C. Я предпочитаю их в объявлениях, потому что они краткие, маленькие и эстетично. Я предпочитаю имена библиотек Torre в API, в которых API зависит от типа данных. - person Craig; 14.10.2020

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

  • Я видел, как ряд разработчиков были сбиты с толку, не зная, использовать ли в их коде строку или строку. Поскольку в C # строка (ключевое слово) точно соответствует System.String (тип FCL), нет никакой разницы, и любой из них может использоваться.
  • В 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 #, но в конечном итоге я пытаюсь сделать свой код похожим на код фреймворка.

person Community    schedule 15.08.2008

string - зарезервированное слово, а String - просто имя класса. Это означает, что string нельзя использовать как имя переменной.

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

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

Если вам действительно нужно имя переменной с именем string, вы можете использовать @ в качестве префикса:

StringBuilder @string = new StringBuilder();

Еще одно важное отличие: Stack Overflow выделяет их по-разному.

person Community    schedule 24.02.2009

Есть одно отличие - вы не можете использовать String без предварительного using System;.

person Community    schedule 27.08.2008

Это было рассмотрено выше; однако вы не можете использовать string в отражении; вы должны использовать String.

person Community    schedule 19.10.2008
comment
Я не понимаю, что означает этот ответ и почему за него проголосовали. Вы можете использовать typeof(string) в отражении. Пример первый: if (someMethodInfo.ReturnType == typeof(string)) { ... } Пример второй: var p = typeof(string).GetProperty("FirstChar", BindingFlags.NonPublic | BindingFlags.Instance); Где вы должны использовать String, а не string? Если вы попробуете такие вещи, как Type.GetType("String") или Type.GetType("string"), ни один из них не найдет класс, потому что пространство имен отсутствует. Если по какой-то глупой причине вы сравниваете .Name типа с "string" с учетом регистра, вы правы. - person Jeppe Stig Nielsen; 24.05.2019

System.String - это строковый класс .NET - в C # string - это псевдоним для System.String, поэтому при использовании они одинаковы.

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

Если вы создаете системы, в которых необходимо указать размер используемых вами целых чисел, и поэтому вы склонны использовать Int16, Int32, UInt16, UInt32 и т. Д., Тогда может показаться более естественным использование String - и при перемещении между разными На языках .net это могло бы сделать вещи более понятными - в противном случае я бы использовал string и int.

person Community    schedule 10.08.2008

Я предпочитаю использовать .NET типы с заглавной буквы (а не псевдонимы) из соображений форматирования. Типы .NET окрашены так же, как и другие типы объектов (в конце концов, типы значений являются собственными объектами).

Условные и управляющие ключевые слова (например, if, switch и return) пишутся строчными буквами и окрашиваются в темно-синий цвет (по умолчанию). И я бы предпочел не иметь разногласий в использовании и формате.

Рассмотреть возможность:

String someString; 
string anotherString; 
person Community    schedule 03.09.2008

string и String идентичны во всех отношениях (кроме прописной буквы "S"). В любом случае это не повлияет на производительность.

В большинстве проектов предпочтительнее использовать строчные буквы string из-за подсветки синтаксиса.

person Community    schedule 18.10.2008

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

string - это тип в C #.

System.String - это тип в среде CLR.

Когда вы используете C # вместе с CLR, string будет сопоставлен с System.String.

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

person Community    schedule 17.03.2009

Это видео YouTube на практике демонстрирует их различия.

Но теперь длинный текстовый ответ.

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

введите описание изображения здесь

System.String он же String (заглавная S) - это .NET тип данных фреймворка, а строка - это C# тип данных.

введите описание изображения здесь

Вкратце String - это псевдоним (то же самое, что называется с разными именами) строки. Таким образом, технически оба приведенных ниже оператора кода дадут одинаковый результат.

String s = "I am String";

or

string s = "I am String";

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

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

Теперь вопрос на миллион долларов с точки зрения программиста. Итак, когда использовать String и String?

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

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

string s = String.ToUpper() ;
person Community    schedule 15.01.2014
comment
Но теперь у вас есть 2 стиля в одной строке? :) - person Wouter; 18.02.2021

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

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

person Community    schedule 10.08.2008
comment
В том-то и проблема, это не псевдонимы C #, это псевдонимы C. В языке C # нет собственных 'string' или 'int', только синтаксический сахар. - person Quarkly; 29.05.2015
comment
не уверен, откуда взялся C, поскольку спецификация языка C # 5 читает. Строка ключевого слова - это просто псевдоним для предопределенного класса System.String. на стр. 85, п. 4.2.4. Все языки высокого уровня являются синтаксическим сахаром над наборами инструкций ЦП и байт-кодом. - person aiodintsov; 24.02.2016

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

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

person Community    schedule 18.10.2008
comment
Для использования String вам не нужно использовать префикс System. - person Joe Ratzer; 18.10.2008
comment
Вы должны включить using System при использовании String, иначе вы получите следующую ошибку: The type or namespace name 'String' could not be found (are you missing a using directive or an assembly reference?) - person Ronald; 16.10.2009

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

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

person Community    schedule 18.10.2008

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

person Community    schedule 19.10.2008

Новый ответ через 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 в других контекстах, где синтаксически единственной возможностью является тип. Например, String local = "Hi mum!"; может быть в порядке (в зависимости от пространства имен и директив using).

Хуже того: если сказать String.Concat(someSequence), скорее всего (в зависимости от usings) будет использован метод расширения 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" в него преобразовать нельзя.

person Community    schedule 15.01.2015

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

person Community    schedule 22.09.2008

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

person Community    schedule 31.05.2011
comment
Хорошая точка зрения. Если бы не была изобретена «струна», у нас не было бы путаницы и не было бы нужды в этом бессмысленном обсуждении. Все наши приложения будут нормально работать со String. 'int' кажется полезным, если вы не заботитесь о размере битов, что происходит в большинстве случаев, а 'string' добавляется только для согласованности. - person Roland; 20.04.2021

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

person Community    schedule 21.10.2011

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

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

  • Я видел, как ряд разработчиков запутались, не зная, использовать ли в их коде строку или строку. Поскольку в 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 # -измы проникают в код библиотеки классов. Например, Microsoft FCL почти полностью написана на C #, и разработчики из группы FCL теперь добавили в библиотеку такие методы, как GetLongLength Array, который возвращает Значение Int64, которое является длинным в C #, но не в других языках (например, C ++ / CLI). Другой пример - метод LongCount в System.Linq.Enumerable.

Я не узнал его мнения, пока не прочитал весь абзац.

person Community    schedule 28.01.2011

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

person Community    schedule 14.01.2012

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

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

person Community    schedule 18.08.2008

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

person Community    schedule 25.04.2011

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

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

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

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

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

person Community    schedule 24.08.2012

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

string vs. 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 не является неправильным, но он оставляет дверь открытой для сюрпризов в будущем.

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

person Community    schedule 11.04.2019
comment
Рад найти здесь этот ответ. Есть разница, и это важно. - person shoelzer; 07.12.2020

Нет никакой разницы.

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

Точно так же int отображается на System.Int32.

person Community    schedule 14.01.2012

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

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

person Community    schedule 01.11.2013

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

person Community    schedule 08.10.2012

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

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

Пример

string String = "I am a string";

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

 typeof(string) == typeof(String) == typeof(System.String)
person Community    schedule 11.06.2014
comment
Единственное небольшое отличие состоит в том, что если вы используете класс String, вам нужно импортировать пространство имен System поверх файла, тогда как при использовании ключевого слова string этого делать не нужно. - person Uttam; 04.03.2018
comment
Существуют простые варианты использования, в которых оператор равенства не работает ... Например, определение вызова типа String в пространстве имен blah и импорт этого пространства имен в файл, в котором выполняется оператор равенства. - person Rick the Scapegoat; 04.06.2019

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

person Community    schedule 24.08.2011

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

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

person Community    schedule 03.10.2012
comment
-1 Все имена типов по соглашению записаны в паскальском регистре. Но все ключевые слова C # пишутся в нижнем регистре. - person P Daddy; 24.04.2013
comment
@PDaddy да, и string действительно ключевое слово C #. Вопрос, который задается здесь, состоит в том, предпочитать ли ключевое слово или имя типа. В моем ответе говорится, что, хотя вы, очевидно, можете выбрать ключевое слово, одним из аргументов в пользу использования имени типа является то, что ключевое слово string, которое является псевдонимом для String, в конечном итоге является ссылочным типом. псевдоним для Int32, который является типом значения. - person Zaid Masud; 24.04.2013
comment
Соглашения о регистре не различаются между ссылочными типами и типами значений, о чем свидетельствует упомянутый вами тип Int32. Нет смысла отказываться от ключевого слова в пользу имени класса, чтобы соблюдать какое-то воображаемое ограничение, согласно которому ссылочные типы следуют другим соглашениям об именах, чем типы значений. - person P Daddy; 24.04.2013
comment
@PDaddy, да, ты прав. Я переносил сюда соглашения Java, где примитивы - это camelCase. - person Zaid Masud; 24.04.2013

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

s 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");
}
person Community    schedule 07.04.2015
comment
Это соглашение больше не действует: если вы используете Visual Studio 2015 и пытаетесь использовать String, программа предлагает вам упростить код, перенеся его на string. - person Massimiliano Kraus; 04.11.2016

Есть одно практическое различие между 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   |
person Community    schedule 18.01.2018
comment
В конце концов, кто-то может указать реальную разницу ... вы также можете добавить необходимость в директиве using System; перед использованием типа String вместо ключевого слова C # string. Это должен быть выбранный ответ или, по крайней мере, получивший высокую оценку. - person mins; 20.09.2019

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

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

person Community    schedule 07.03.2014

В случае, если действительно полезно увидеть, что нет разницы между 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 ]
person Community    schedule 01.10.2015
comment
Я дал вам +1, но ваши фактические методы при включенной оптимизации + идентичны return "Hello World!";. Чтобы убедиться, что типы учитываются, вы можете использовать return (string)(object)typeof(string).Name; и return (System.String)(System.Object)typeof(System.String).Name;, что подтверждает, что System.Object тоже идентичен object :-) - person Mark Hurd; 26.10.2015

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

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

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

person Community    schedule 04.10.2012
comment
Не забудьте назвать эти другие языки, потому что я не знаю ни одного в .net, где строка! = System.String. Кроме того, литерал не имеет ничего общего со строкой и строкой ... - person Andy; 08.10.2016
comment
Неужели 26 избирателей считают, что это правильно? - person Dawood ibn Kareem; 21.02.2019
comment
@Andy Я работал с Java, когда я ответил на это, где это имеет значение, не уверен, что вопрос указан .net, когда я ответил на него, поскольку он был отредактирован с тех пор - person Inverted Llama; 21.02.2019

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

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

person Community    schedule 30.12.2014

В C # строка - это сокращенная версия System.String (String). По сути, они означают одно и то же.

Прямо как bool и Boolean, особой разницы нет ..

person Community    schedule 05.01.2018
comment
короткая версия - насколько это коротко? Заглавная буква делает слово длиннее? - person Michael Adams; 05.07.2021
comment
Привет, @MichaelAdams, спасибо, что указали на это. Я имел в виду, что string - это сокращенная версия System.String. - person Taslim Oseni; 14.07.2021

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

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

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

person Community    schedule 08.02.2018
comment
так что внутренне они такие же. это означает, что они указывают на одно и то же и могут использоваться как взаимозаменяемые. их различие заключается в том, что String - это имя фактической структуры, как определено, тогда как string - это псевдоним, который указывает на ту же самую структуру. it (строка), являющаяся псевдонимом, делает его ключевым словом, поэтому VS показывает их как разные цвета. Если вы щелкните правой кнопкой мыши, чтобы просмотреть определение строки, вы увидите структуру String. - person Heriberto Lugo; 14.02.2018

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

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

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

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

person Community    schedule 01.02.2018

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

строка: Тип строки представляет собой последовательность из нуля или более символов Юникода. string - это псевдоним для String в .NET Framework. string - это внутренний тип данных C # и псевдоним для предоставленного системой типа "System.String". В спецификации C # указано, что с точки зрения стиля ключевое слово (строка) предпочтительнее полного имени типа системы (System.String или String). Хотя строка является ссылочным типом, операторы равенства (== и! =) Определены для сравнения значений строковых объектов, а не ссылок. Это делает тестирование на равенство строк более интуитивным. Например:

Разница между строкой и строкой:

  • string обычно используется для объявления, а String используется для доступа к статическим строковым методам.
  • Вы можете использовать 'string' для объявления полей, свойств и т. Д., Которые используют предопределенный тип 'string', поскольку спецификация C # говорит мне, что это хороший стиль.
  • Вы можете использовать 'String' для использования системных методов, таких как String.Compare и т. Д. Они изначально определены в 'System.String', а не в 'string'. 'string' в данном случае просто псевдоним.
  • Вы также можете использовать 'String' или System.Int32 при взаимодействии с другой системой, особенно если они совместимы с CLR. то есть - если я получаю данные из другого места, я бы десериализовал их в System.Int32, а не в int, если источник по определению был чем-то другим, кроме системы C #.
person Community    schedule 20.05.2014
comment
Где ты это достаешь? Все это полная чушь: String и string - это одно и то же. - person Jay Sullivan; 24.09.2014
comment
@JaySullivan Я бы хотел не согласиться. - person Neo; 07.11.2019

Честно говоря, на практике обычно нет разницы между System.String и string.

Все типы в C # являются объектами и производными от класса System.Object. Одно отличие состоит в том, что строка является ключевым словом C #, а String можно использовать в качестве имени переменной. System.String - стандартное имя этого типа в .NET, а строка - удобное имя C #. Вот простая программа, которая показывает разницу между System.String и строкой.

string a = new string(new char[] { 'x', 'y', 'z' });
string b = new String(new char[] { 'x', 'y', 'z' });
String c = new string(new char[] { 'x', 'y', 'z' });
String d = new String(new char[] { 'x', 'y', 'z' });
MessageBox.Show((a.GetType() == typeof(String) && a.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((b.GetType() == typeof(String) && b.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((c.GetType() == typeof(String) && c.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((d.GetType() == typeof(String) && d.GetType() == typeof(string)).ToString()); // shows true

@JonSkeet в моем компиляторе

public enum Foo : UInt32 { }

работает. У меня есть сообщество Visual Studio 2015.

person Community    schedule 04.06.2016

Между ними нет разницы. Вы можете использовать любой из них в своем коде.

System.String - это класс (ссылочный тип), определенный mscorlib в пространстве имен System. Другими словами, System.String - это тип в CLR.

string - ключевое слово в C#

person Community    schedule 20.01.2016

В контексте документации MSDN класс String задокументирован, как и любой другой тип данных (например,, XmlReader, StreamReader) в BCL.

И string задокументирован как ключевое слово (справочник по C #) или как любая базовая конструкция языка C # (например,, for, while, default).

Справочник.

person Community    schedule 26.07.2014

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

Как бы то ни было, я использую строку для объявления типов - переменных, свойств, возвращаемых значений и параметров. Это согласуется с использованием других типов систем - int, bool, var и т. Д. (Хотя Int32 и Boolean также верны).

Я использую String при использовании статических методов класса String, например String.Split() или String.IsNullOrEmpty(). Я считаю, что это имеет больше смысла, потому что методы принадлежат классу, и это согласуется с тем, как я использую другие статические методы.

person Community    schedule 28.12.2015

строка равна System.String
в VS2015, если вы напишете это

System.String str;

Компилятор покажет потенциальное исправление для его оптимизации, и после применения этого исправления он будет выглядеть следующим образом

string str;
person Community    schedule 25.03.2017

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

Если вы щелкните правой кнопкой мыши ключевое слово string и выберите Go to definition в контекстном меню, вы попадете в класс String - это просто синтаксический сахар, но он улучшает читаемость imo.

person Community    schedule 18.10.2017

Строка - это последовательный набор символов, который используется для представления текста.

Объект String - это последовательный набор объектов System.Char, представляющих строку; объект System.Char соответствует кодовой единице UTF-16.

Значение объекта String - это содержимое последовательной коллекции объектов System.Char, и это значение является неизменным (то есть доступно только для чтения).

Дополнительные сведения о неизменности строк см. В разделе «Неизменяемость и класс StringBuilder» в msdn.

Максимальный размер объекта String в памяти составляет 2 ГБ или около 1 миллиарда символов.

Примечание: ответ взят из раздела справки msdn. Вы можете увидеть полное содержимое здесь, в строке msdn Тема курса в разделе "Примечания"

person Community    schedule 10.11.2017

string - это краткое название System.String . String или System.String - имя строки в CTS(Common Type System).

person Community    schedule 12.01.2018

Насколько мне известно, string - это просто псевдоним для System.String, и похожие псевдонимы существуют для bool, object, _5 _... единственное небольшое различие состоит в том, что вы можете использовать string без директивы "using System;", в то время как String требует этого ( в противном случае вы должны указать System.String полностью).

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

person Community    schedule 20.06.2014

Строка: представляет класс.

строка: представляет псевдоним

Это просто соглашение о кодировании от Microsoft.

person Community    schedule 11.12.2016

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

В моем случае я предпочитаю использовать string, а не System.String, потому что String требует пространства имен using System; или полного имени System.String.

Я считаю, что псевдоним string был создан для простоты, и мне он нравится!

person Community    schedule 12.07.2018

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

person Community    schedule 22.07.2018

Обычно переменную объявляют с помощью ключевых слов C #. Фактически, каждый тип C # имеет эквивалент в .NET. Другой пример: short и int в C # сопоставляются с Int16 и Int32 в .NET. Итак, технически нет разницы между строкой и строкой, но в C # строка является псевдонимом для класса String в .NET framework.

person Community    schedule 01.12.2018

string - это псевдоним для String в .NET Framework.

Где "String" на самом деле System.String.

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

Хотя было бы лучше согласиться с тем, какой из них вы использовали.

Как бы то ни было, я использую string для объявления типов - переменных, свойств, возвращаемых значений и параметров. Это согласуется с использованием других типов систем - int, bool, var и т. Д. (Хотя Int32 и Boolean также верны).

Я использую String при использовании статических методов класса String, например String.Split() или String.IsNullOrEmpty(). Я считаю, что это имеет больше смысла, потому что методы принадлежат классу, и это согласуется с тем, как я использую другие статические методы.

person Community    schedule 11.06.2014

String - это класс string. Если вы удалите System пространство имен из операторов using, вы увидите, что String ушел, но string все еще здесь. string - ключевое слово для String. Like
int and Int32
short and Int16
long and Int64

Таким образом, ключевые слова - это всего лишь некоторые слова, в которых используется класс. Эти ключевые слова определены C # (то есть Microsoft, потому что C # принадлежит Microsoft). Вкратце, разницы нет. Используя string or String. Это не имеет значения. Они такие же.

person Community    schedule 16.10.2018

Все вышесказанное в принципе правильно. Это можно проверить. Просто напишите короткий метод

public static void Main()
{
    var s = "a string";
}

скомпилируйте его и откройте .exe с помощью ildasm, чтобы увидеть

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       8 (0x8)
  .maxstack  1
  .locals init ([0] string s)
  IL_0000:  nop
  IL_0001:  ldstr      "a string"
  IL_0006:  stloc.0
  IL_0007:  ret
} // end of method Program::Main

затем измените var на string и String, скомпилируйте, откройте с помощью ildasm и увидите, что IL не изменится. Это также показывает, что создатели языка предпочитают просто string при определении переменных (спойлер: при вызове членов они предпочитают String).

person Community    schedule 25.06.2019
comment
Насколько мне известно, string vs. String - это вопрос стиля кодирования. - person Ted Mucuzany; 04.07.2019
comment
И string стремится к победе. - person Ted Mucuzany; 04.07.2019

объявить строковую переменную со строкой, но использовать класс String при доступе к одному из его статических членов:

String.Format()

Переменная

string name = "";
person Community    schedule 14.05.2019
comment
Почему? Чем String.Format() отличается от string.Format() или string name = ""; от String name = "";? Я понимаю, что в этой части вопроса требуются рекомендации по использованию, но каков источник или основа этих рекомендаций? - person Lance U. Matthews; 21.06.2020

Их много (например, Джеффри Рихтер в его книге CLR Via C #), которые говорят, что нет никакой разницы между System.String и string, а также System.Int32 и int, но мы должны различать немного глубже, чтобы действительно выжать сок из этого вопроса, чтобы мы могли получить все его питательная ценность (напишите лучший код).

А. Они такие же ...

  1. компилятору.
  2. разработчику. (Мы знаем №1 и в конечном итоге достигли автопилота.)

Б. Они разные в Famework и в контекстах, отличных от C #. Другой...

  1. на ДРУГИЕ языки, НЕ являющиеся C #
  2. в оптимизированном контексте CIL (был MSIL) (язык ассемблера .NET VM)
  3. в контексте, ориентированном на платформу - .NET Framework или Mono или любая область типа CIL
  4. в книге, ориентированной на несколько языков .NET (например, VB.NET, F # и т. д.)

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

C. Подводя итоги ...

Вы используете string и int и другие типы C # в целевой аудитории, предназначенной только для C # (задайте вопрос, кто будет читать этот код или использовать эту библиотеку). Что касается вашей внутренней компании, если вы используете только C #, придерживайтесь типов C #.

... и вы используете System.String и System.Int32 в многоязычной целевой аудитории или целевой аудитории (когда C # не единственная аудитория). Для своей внутренней организации, если вы также используете VB.NET, F # или любой другой язык .NET или разрабатываете библиотеки для использования клиентами, которые могут, тогда вам следует использовать типы «Frameworky» в этих контекстах, чтобы каждый мог понять ваш интерфейс. , независимо от того, из какой они вселенной. (Во всяком случае, что такое клингон для System.String?)

HTH.

person Community    schedule 16.08.2019
comment
Б. Они различны в Famework и в контекстах, отличных от C #: хотя это может быть правдой, ответ не говорит о различиях, он только перечисляет контексты, в которых они могут появиться. Технически он не отвечает на вопрос и, к сожалению, не помогает больше, чем выбранный ответ. - person mins; 20.09.2019
comment
Они ОДИНАКОВЫЕ (точно такие же): нет, попробуйте это: string s = nameof (string), чтобы убедиться. - person mins; 05.10.2019

Результат изображения для строки и строки www.javatpoint.com В C # string является псевдонимом для String класса в. NET Framework. Фактически, каждый тип C # имеет эквивалент в .NET.
Еще одно небольшое отличие заключается в том, что если вы используете класс String, вам нужно импортировать пространство имен System, тогда как у вас нет для импорта пространства имен при использовании ключевого слова string

person Community    schedule 02.07.2019

Нет большой разницы между string и String в C #.

String - это класс в платформе .NET в пространстве имен System. Полное имя - System.String. Строка в нижнем регистре - это псевдоним System.String.

Но рекомендуется использовать string при объявлении таких переменных, как:

string str = "Hello";

И мы можем использовать String при использовании любого встроенного метода для таких строк, как String.IsNullOrEmpty().

Также есть одно различие между этими двумя: перед использованием String мы должны импортировать системное пространство имен в файл cs, и string можно использовать напрямую.

person Community    schedule 01.03.2021