Вопрос: В чем разница между строкой и строкой в ​​C #?


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

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

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


5261


источник


Ответы:


stringявляется псевдонимом в C # для System.String,
Так что технически, нет никакой разницы. Это как int против System.Int32,

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

например

string place = "world";

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

например

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

Это стиль, который Microsoft имеет тенденцию использовать в их примеры ,


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


5009



Просто ради полноты, вот свалка мозга связанной информации ...

Как отмечали другие, stringявляется псевдонимом для System.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, char... в отличие от тип например, при использовании объявлений переменных. Это не указывает на другую разницу.

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


2991



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

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


594



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

  • Я видел, как ряд разработчиков смутился, не зная, следует ли использовать строка или строка в их коде. Потому что в C # строка (ключевое слово) точно сопоставляется с System.String (тип FCL), нет никакой разницы и может быть использована.
  • В C # длинный карты для System.Int64 , но на другом языке программирования, длинный может отображать Int16 или Int32 , На самом деле, C ++ / CLI на самом деле долго Int32 , Кто-то, читающий исходный код на одном языке, может легко неверно истолковать намерение кода, если он или она будет использоваться для программирования на другом языке программирования. На самом деле, большинство языков даже не длинный как ключевое слово и не будет компилировать код, который его использует.
  • FCL имеет множество методов, которые имеют имена типов как часть имен их методов. Например, BinaryReader тип предлагает такие методы, как ReadBoolean , ReadInt32 , ReadSingle , и так далее, и System.Convert тип предлагает такие методы, как ToBoolean , ToInt32 , ToSingle , и так далее. Хотя законно писать следующий код, линия с поплавком кажется мне очень неестественной, и не очевидно, что строка правильная:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // Ok, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Итак, у вас это есть. Я думаю, что все это действительно хорошие моменты. Я, однако, не нахожусь, используя совет Джеффри в своем собственном коде. Возможно, я слишком застрял в моем мире C #, но в итоге я пытаюсь сделать код похожим на код рамки.


395



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

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

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

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

StringBuilder @string = new StringBuilder();

Другая критическая разница: переполнение стека подчеркивает их по-разному.


369



Существует одна разница - вы не можете использовать Stringбез using System;заранее.


320



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


264



System.String is the .NET string class - in C# string is an alias for System.String - so in use they are the same.

As for guidelines I wouldn't get too bogged down and just use whichever you feel like - there are more important things in life and the code is going to be the same anyway.

If you find yourselves building systems where it is necessary to specify the size of the integers you are using and so tend to use Int16, Int32, UInt16, UInt32 etc. then it might look more natural to use String - and when moving around between different .net languages it might make things more understandable - otherwise I would use string and int.


197