Просто для полноты, вот мозговая свалка соответствующей информации ...
Как уже отмечалось, 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
Это просто вопрос того, как спецификация определяет объявления enum - часть после двоеточия должна быть производной интегрального типа , которая является одним токеном sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
... в отличие от производства type , используемого, например, объявлениями переменных. Никаких других отличий это не указывает.
Наконец, когда речь заходит о том, что использовать: лично я использую псевдонимы везде для реализации, но тип CLR для любых API. На самом деле не имеет большого значения, какой вы используете с точки зрения реализации - согласованность в вашей команде - это хорошо, но больше никого не волнует. С другой стороны, очень важно, что если вы ссылаетесь на тип в API, вы делаете это не зависящим от языка способом. Метод с именем ReadInt32
является однозначным, тогда как метод с именем ReadInt
требует интерпретации. Вызывающая сторона может использовать язык, который определяет псевдоним int
для Int16
, например. Разработчики фреймворка .NET следовали этому шаблону, хорошие примеры - в классах BitConverter
, BinaryReader
и Convert
.