Пример (обратите внимание на случай):
string s = "Hello world!";
String s = "Hello world!";
Каковы правила использования каждого из них? А в чем отличия?
Пример (обратите внимание на случай):
string s = "Hello world!";
String s = "Hello world!";
Каковы правила использования каждого из них? А в чем отличия?
string
- это псевдоним в C # для _ 2_.
Технически разницы нет. Это похоже на int
vs. System.Int32
.
Что касается рекомендаций, обычно рекомендуется использовать string
каждый раз, когда вы обращаетесь к объекту.
e.g.
string place = "world";
Точно так же я думаю, что обычно рекомендуется использовать String
, если вам нужно обратиться конкретно к классу.
e.g.
string greet = String.Format("Hello {0}!", place);
Похоже, что руководство в этой области могло измениться, поскольку StyleCop теперь требует использования псевдонимов, специфичных для C #.
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
.
String
означает System.String
, и это тип .NET Framework. string
- это псевдоним на языке C # для System.String
. Оба они скомпилированы в System.String
на IL (промежуточном языке), поэтому нет никакой разницы. Выберите то, что вам нравится, и используйте это. Если вы пишете код на C #, я бы предпочел string
, поскольку это псевдоним типа C # и хорошо известен программистам на C #.
То же самое могу сказать и о (int
, System.Int32
) и т. Д.
int
определен в спецификации языка C # как 32-битное целое число независимо от оборудования. C #, несмотря на общее наследие в глубине веков, на самом деле не является C. Изменение int
на 64-битное целое число было бы серьезным изменением в спецификации и языке. Это также потребует переопределения long
, поскольку long
в настоящее время является 64-битным целым числом. Другая причина не беспокоиться не имеет значения, поскольку типы никогда не изменятся, но .NET достаточно абстрактна, чтобы в 99% случаев вам все равно не приходилось об этом думать. ;-)
- person Craig; 08.12.2018
Int16
, Int32
и Int64
является частью более прозрачным в коде, чем использование довольно неописательных short
, int
и long
- person Nyerguds; 09.12.2018
Лучший ответ, который я когда-либо слышал об использовании предоставленных псевдонимов типов в C #, исходит от Джеффри Рихтера в его книге CLR через C #. Вот его 3 причины:
- Я видел, как ряд разработчиков были сбиты с толку, не зная, использовать ли в их коде строку или строку. Поскольку в C # строка (ключевое слово) точно соответствует System.String (тип FCL), нет никакой разницы, и любой из них может использоваться.
- В C # long сопоставляется с System.Int64, но в другом языке программирования long может сопоставляться с Int16 strong > или 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 #, но в конечном итоге я пытаюсь сделать свой код похожим на код фреймворка.
string
- зарезервированное слово, а String
- просто имя класса. Это означает, что string
нельзя использовать как имя переменной.
Если по какой-то причине вам нужна переменная с именем string, вы увидите только первую из этих компиляций:
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
Если вам действительно нужно имя переменной с именем string, вы можете использовать @
в качестве префикса:
StringBuilder @string = new StringBuilder();
Еще одно важное отличие: Stack Overflow выделяет их по-разному.
Есть одно отличие - вы не можете использовать String
без предварительного using System;
.
Это было рассмотрено выше; однако вы не можете использовать string
в отражении; вы должны использовать String
.
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.
Я предпочитаю использовать .NET
типы с заглавной буквы (а не псевдонимы) из соображений форматирования. Типы .NET
окрашены так же, как и другие типы объектов (в конце концов, типы значений являются собственными объектами).
Условные и управляющие ключевые слова (например, if
, switch
и return
) пишутся строчными буквами и окрашиваются в темно-синий цвет (по умолчанию). И я бы предпочел не иметь разногласий в использовании и формате.
Рассмотреть возможность:
String someString;
string anotherString;
string
и String
идентичны во всех отношениях (кроме прописной буквы "S"). В любом случае это не повлияет на производительность.
В большинстве проектов предпочтительнее использовать строчные буквы string
из-за подсветки синтаксиса.
C # - это язык, который используется вместе с CLR.
string
- это тип в C #.
System.String
- это тип в среде CLR.
Когда вы используете C # вместе с CLR, string
будет сопоставлен с System.String
.
Теоретически можно реализовать компилятор C #, генерирующий байт-код Java. Разумная реализация этого компилятора, вероятно, отобразит string
в java.lang.String
для взаимодействия с библиотекой времени выполнения Java.
Это видео 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() ;
Нижний регистр string
- это псевдоним для System.String
. Они такие же в C#
.
Ведутся споры о том, следует ли использовать типы System (System.Int32
, System.String
и т. Д.) Или типы C# aliases
(int
, string
и т. Д.). Я лично считаю, что вам следует использовать C# aliases
, но это только мои личные предпочтения.
string
- это просто псевдоним для System.String
. Компилятор будет относиться к ним одинаково.
Единственное практическое различие - это выделение синтаксиса, как вы упомянули, и то, что вам нужно написать using System
, если вы используете String
.
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
Как говорят другие, они такие же. Правила StyleCop по умолчанию заставят вас использовать string
в качестве передовой практики стиля кода C #, за исключением ссылок на System.String
статические функции, такие как String.Format
, String.Join
, String.Concat
и т. Д.
Новый ответ через 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)
, скорее всего (в зависимости от 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"
в него преобразовать нельзя.
Использование системных типов упрощает перенос между C # и VB.Net, если вам нравятся подобные вещи.
Вопреки тому, что кажется обычной практикой среди других программистов, я предпочитаю String
string
, просто чтобы подчеркнуть тот факт, что String
является ссылочным типом, как упомянул Джон Скит.
string
- это псевдоним (или сокращение) System.String
. Это означает, что, набирая string
, мы имели в виду System.String
. Вы можете прочитать больше в ссылке Think: 'строка' - это псевдоним / сокращение от System.String.
Я просто хотел бы добавить это к ответу 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 strong > или 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.
Я не узнал его мнения, пока не прочитал весь абзац.
String (System.String
) - это класс в библиотеке базовых классов. строка (нижний регистр) - это зарезервированная работа в C #, которая является псевдонимом для System.String. Int32 vs int - аналогичная ситуация, как и Boolean vs. bool
. Эти ключевые слова, специфичные для языка C #, позволяют объявлять примитивы в стиле, аналогичном C.
На самом деле это вопрос условности. string
просто больше похож на стиль C / C ++. По общему соглашению следует использовать любые сочетания клавиш, которые предоставляет выбранный вами язык (int / Int для Int32
). Это касается и «объекта», и decimal
.
Теоретически это могло бы помочь перенести код в какой-нибудь будущий 64-битный стандарт, в котором "int" может означать Int64
, но дело не в этом, и я ожидал бы, что любой мастер обновления в любом случае изменит любые int
ссылки на Int32
на всякий случай.
String
не является ключевым словом и может использоваться в качестве идентификатора, тогда как string
является ключевым словом и не может использоваться в качестве идентификатора. И с точки зрения функций оба они одинаковы.
Опаздываю на вечеринку: я использую типы CLR 100% времени (ну, кроме случаев, когда принудительно использовать тип C #, но я не помню, когда это было в последний раз).
Первоначально я начал делать это много лет назад, согласно книгам Ричи по CLR. Для меня было логично, что все языки CLR в конечном итоге должны поддерживать набор типов CLR, поэтому использование самих типов CLR обеспечивает более ясный и, возможно, более «повторно используемый» код.
Теперь, когда я занимаюсь этим в течение многих лет, это стало привычкой, и мне нравится окраска, которую VS показывает для типов CLR.
Единственный недостаток заключается в том, что автозаполнение использует тип C #, поэтому я снова набираю автоматически сгенерированные типы, чтобы вместо этого указать тип CLR.
Кроме того, теперь, когда я вижу "int" или "string", мне это кажется действительно неправильным, как будто я смотрю на код C. 1970-х годов.
@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
не является неправильным, но он оставляет дверь открытой для сюрпризов в будущем.
Примечание: я скопировал / вставил большинство сообщений в блоге для архивных целей. Я игнорирую некоторые части, поэтому рекомендую пропустить и прочитать сообщение в блоге, если можете.
Нет никакой разницы.
Ключевое слово C # string
соответствует типу .NET System.String
- это псевдоним, который соответствует соглашениям об именах, принятым в языке.
Точно так же int
отображается на System.Int32
.
По этому поводу есть цитата из книги Дэниела Солиса.
Все предопределенные типы сопоставляются непосредственно с базовыми типами .NET. Имена типов C # (строка) - это просто псевдонимы для типов .NET (String или System.String), поэтому использование имен .NET синтаксически отлично работает, хотя это не рекомендуется. В программе на C # следует использовать имена C #, а не имена .NET.
Да, никакой разницы между ними, как и bool
и Boolean
.
строка - это ключевое слово, и вы не можете использовать строку в качестве идентификатора.
Строка не является ключевым словом, и вы можете использовать ее в качестве идентификатора:
Пример
string String = "I am a string";
Ключевое слово string
является псевдонимом для System.String
, за исключением проблемы с ключевым словом, эти два слова полностью эквивалентны.
typeof(string) == typeof(String) == typeof(System.String)
Между ними нет разницы - string
, однако, кажется предпочтительным вариантом при рассмотрении исходного кода других разработчиков.
Один аргумент, не упомянутый в другом месте, чтобы предпочесть паскаль String
:
System.String
- это ссылочный тип, а имена ссылочных типов по соглашению записываются в паскальском регистре.
string
действительно ключевое слово C #. Вопрос, который задается здесь, состоит в том, предпочитать ли ключевое слово или имя типа. В моем ответе говорится, что, хотя вы, очевидно, можете выбрать ключевое слово, одним из аргументов в пользу использования имени типа является то, что ключевое слово string
, которое является псевдонимом для String
, в конечном итоге является ссылочным типом. псевдоним для Int32
, который является типом значения.
- person Zaid Masud; 24.04.2013
Int32
. Нет смысла отказываться от ключевого слова в пользу имени класса, чтобы соблюдать какое-то воображаемое ограничение, согласно которому ссылочные типы следуют другим соглашениям об именах, чем типы значений.
- person P Daddy; 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");
}
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 |
using System;
перед использованием типа String
вместо ключевого слова C # string
. Это должен быть выбранный ответ или, по крайней мере, получивший высокую оценку.
- person mins; 20.09.2019
Разницы практически нет
Строка ключевого слова C # сопоставляется с типом .NET System.String - это псевдоним, который соответствует соглашениям об именах, принятым в языке.
В случае, если действительно полезно увидеть, что нет разницы между 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 ]
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, если вы хотите иметь дело с литералами.
Для использования string
не требуется пространство имен import (с использованием System
;), поскольку это глобальный псевдоним System.String
.
Чтобы узнать больше о псевдонимах, перейдите по этой ссылке.
В C # строка - это сокращенная версия System.String (String). По сути, они означают одно и то же.
Прямо как bool
и Boolean
, особой разницы нет ..
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.».
Джеффри Рихтер написал:
Другой способ подумать об этом - компилятор C # автоматически предполагает, что у вас есть следующие директивы
using
во всех ваших файлах исходного кода:
using int = System.Int32;
using uint = System.UInt32;
using string = System.String;
...
Я видел, как многие разработчики были сбиты с толку, не зная, использовать ли в своем коде строку или строку. Поскольку в C # строка (ключевое слово) точно соответствует System.String (тип FCL), нет никакой разницы, и любой из них может использоваться.
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 #.String
и string
- это одно и то же.
- person Jay Sullivan; 24.09.2014
Честно говоря, на практике обычно нет разницы между 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.
Между ними нет разницы. Вы можете использовать любой из них в своем коде.
System.String
- это класс (ссылочный тип), определенный mscorlib
в пространстве имен System
. Другими словами, System.String
- это тип в CLR
.
string
- ключевое слово в C#
В контексте документации MSDN класс String
задокументирован, как и любой другой тип данных (например,, XmlReader
, StreamReader
) в BCL.
И string
задокументирован как ключевое слово (справочник по C #) или как любая базовая конструкция языка C # (например,, for
, while
, default
).
Как уже указывалось, это одно и то же, а string
- это просто псевдоним для String
.
Как бы то ни было, я использую строку для объявления типов - переменных, свойств, возвращаемых значений и параметров. Это согласуется с использованием других типов систем - int, bool, var
и т. Д. (Хотя Int32
и Boolean
также верны).
Я использую String
при использовании статических методов класса String, например String.Split()
или String.IsNullOrEmpty()
. Я считаю, что это имеет больше смысла, потому что методы принадлежат классу, и это согласуется с тем, как я использую другие статические методы.
строка равна System.String
в VS2015, если вы напишете это
System.String str;
Компилятор покажет потенциальное исправление для его оптимизации, и после применения этого исправления он будет выглядеть следующим образом
string str;
Я предпочитаю использовать string
, потому что этот тип используется так часто, что я не хочу, чтобы подсветчик синтаксиса смешивал его со всеми другими классами. Хотя это класс, он используется больше как примитив, поэтому я думаю, что другой цвет выделения уместен.
Если вы щелкните правой кнопкой мыши ключевое слово string
и выберите Go to definition
в контекстном меню, вы попадете в класс String
- это просто синтаксический сахар, но он улучшает читаемость imo.
Строка - это последовательный набор символов, который используется для представления текста.
Объект String - это последовательный набор объектов System.Char, представляющих строку; объект System.Char соответствует кодовой единице UTF-16.
Значение объекта String - это содержимое последовательной коллекции объектов System.Char, и это значение является неизменным (то есть доступно только для чтения).
Дополнительные сведения о неизменности строк см. В разделе «Неизменяемость и класс StringBuilder» в msdn.
Максимальный размер объекта String в памяти составляет 2 ГБ или около 1 миллиарда символов.
Примечание: ответ взят из раздела справки msdn. Вы можете увидеть полное содержимое здесь, в строке msdn Тема курса в разделе "Примечания"
string
- это краткое название System.String
. String
или System.String
- имя строки в CTS(Common Type System)
.
Насколько мне известно, string
- это просто псевдоним для System.String
, и похожие псевдонимы существуют для bool
, object
, _5 _... единственное небольшое различие состоит в том, что вы можете использовать string
без директивы "using System;
", в то время как String требует этого ( в противном случае вы должны указать System.String
полностью).
Что лучше использовать, думаю, дело вкуса. Лично я предпочитаю string
, но это не религиозный вопрос.
Строка: представляет класс.
строка: представляет псевдоним
Это просто соглашение о кодировании от Microsoft.
Как вы уже знаете, string
- это просто псевдоним для System.String
. Но что мне использовать? это просто личные предпочтения.
В моем случае я предпочитаю использовать string
, а не System.String
, потому что String
требует пространства имен using System;
или полного имени System.String
.
Я считаю, что псевдоним string
был создан для простоты, и мне он нравится!
строка - это ярлык для System.String
. Единственная разница в том, что вам не нужно ссылаться на пространство имен System.String
. Так что было бы лучше использовать строку, чем String.
Обычно переменную объявляют с помощью ключевых слов C #. Фактически, каждый тип C # имеет эквивалент в .NET. Другой пример: short и int в C # сопоставляются с Int16 и Int32 в .NET. Итак, технически нет разницы между строкой и строкой, но в C # строка является псевдонимом для класса String в .NET framework.
string - это псевдоним для String в .NET Framework.
Где "String" на самом деле System.String.
Я бы сказал, что они взаимозаменяемы и нет разницы, когда и где использовать тот или другой.
Хотя было бы лучше согласиться с тем, какой из них вы использовали.
Как бы то ни было, я использую string
для объявления типов - переменных, свойств, возвращаемых значений и параметров. Это согласуется с использованием других типов систем - int, bool, var
и т. Д. (Хотя Int32
и Boolean
также верны).
Я использую String при использовании статических методов класса String, например String.Split()
или String.IsNullOrEmpty()
. Я считаю, что это имеет больше смысла, потому что методы принадлежат классу, и это согласуется с тем, как я использую другие статические методы.
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
. Это не имеет значения. Они такие же.
Все вышесказанное в принципе правильно. Это можно проверить. Просто напишите короткий метод
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
).
string
vs. String
- это вопрос стиля кодирования.
- person Ted Mucuzany; 04.07.2019
string
стремится к победе.
- person Ted Mucuzany; 04.07.2019
объявить строковую переменную со строкой, но использовать класс String при доступе к одному из его статических членов:
String.Format()
Переменная
string name = "";
String.Format()
отличается от string.Format()
или string name = "";
от String name = "";
? Я понимаю, что в этой части вопроса требуются рекомендации по использованию, но каков источник или основа этих рекомендаций?
- person Lance U. Matthews; 21.06.2020
Их много (например, Джеффри Рихтер в его книге CLR Via C #), которые говорят, что нет никакой разницы между System.String
и string
, а также System.Int32
и int
, но мы должны различать немного глубже, чтобы действительно выжать сок из этого вопроса, чтобы мы могли получить все его питательная ценность (напишите лучший код).
А. Они такие же ...
Б. Они разные в Famework и в контекстах, отличных от C #. Другой...
Итак, верный ответ заключается в том, что этот вопрос даже существует только потому, что C # должен совместно владеть пространством .NET с другими языками.
C. Подводя итоги ...
Вы используете string
и int
и другие типы C # в целевой аудитории, предназначенной только для C # (задайте вопрос, кто будет читать этот код или использовать эту библиотеку). Что касается вашей внутренней компании, если вы используете только C #, придерживайтесь типов C #.
... и вы используете System.String
и System.Int32
в многоязычной целевой аудитории или целевой аудитории (когда C # не единственная аудитория). Для своей внутренней организации, если вы также используете VB.NET, F # или любой другой язык .NET или разрабатываете библиотеки для использования клиентами, которые могут, тогда вам следует использовать типы «Frameworky» в этих контекстах, чтобы каждый мог понять ваш интерфейс. , независимо от того, из какой они вселенной. (Во всяком случае, что такое клингон для System.String
?)
HTH.
string s = nameof (string)
, чтобы убедиться.
- person mins; 05.10.2019
Результат изображения для строки и строки www.javatpoint.com В C # string
является псевдонимом для String
класса в. NET Framework. Фактически, каждый тип C # имеет эквивалент в .NET.
Еще одно небольшое отличие заключается в том, что если вы используете класс String
, вам нужно импортировать пространство имен System
, тогда как у вас нет для импорта пространства имен при использовании ключевого слова string
Нет большой разницы между string
и String
в C #.
String
- это класс в платформе .NET в пространстве имен System. Полное имя - System.String
. Строка в нижнем регистре - это псевдоним System.String
.
Но рекомендуется использовать string
при объявлении таких переменных, как:
string str = "Hello";
И мы можем использовать String
при использовании любого встроенного метода для таких строк, как String.IsNullOrEmpty()
.
Также есть одно различие между этими двумя: перед использованием String
мы должны импортировать системное пространство имен в файл cs, и string
можно использовать напрямую.
string
- это лексическая конструкция грамматики C #, тогда какSystem.String
- это просто тип. Независимо от каких-либо явных различий, упомянутых в какой-либо спецификации, все же существует это неявное различие, которое может быть учтено с некоторой двусмысленностью. Сам язык должен поддерживатьstring
таким образом, что реализация (совсем) не обязана учитывать это для конкретного класса в BCL. - person Kirk Woll   schedule 02.12.2014string
как точно такой же, как тип BCLSystem.String
, и ничего больше. Это совсем не двусмысленно. Конечно, вы можете реализовать свой собственный компилятор, используя грамматику C #, и использовать все найденные подобные токены для чего-то произвольного, не связанного с тем, что определено в спецификации языка C #. Однако полученный язык будет похож только на C #, он не может считаться C #. - person O. R. Mapper   schedule 02.12.2014string
без директивы using для System. Вы не можете этого сделать сString
. - person Wilsu   schedule 30.11.2015string
что-то не так. Необходимо сократитьSystem.String
, но как псевдоним это похоже, но не совсем то же самое. Однако после нескольких лет использования C #, я бы сказал, безопасно просто использоватьstring
иstring.Format()
и не беспокоиться оSystem.String
. - person Roland   schedule 20.12.2016System.String
все еще существует, и ключевое словоstring
все еще является его псевдонимом. Так же, какSystem.Int32
иint
. Это буквально одно и то же. - person Craig   schedule 08.12.2018