Ответ 1
string
не является примитивным типом в С#. Это одна из двух предопределенных (т.е. Части спецификации языка) ссылочных типов в С# (другая - object
). Примитивными типами в С# являются Boolean
(bool
), Byte
(Byte
), SByte
(SByte
), Int16
(short
), UInt16
, Int32
(int
), UInt32 (uint
), Int64
(long
), UInt64 (ulong
), IntPtr
, UIntPtr
, Char
(Char
), Double
(Double
) и Single
(Single
).
Обратите внимание, что в спецификации указано: "Также возможно использовать структуры и оператор
перегрузка для реализации новых "примитивных" типов на языке С# ", но typeof(MyStruct).IsPrimitive
является false
, если MyStruct
является определяемым пользователем struct
.
Я получил книгу и начал читать и практиковать с кодом. Я был удивлен, когда увидел, что строка в С# считается примитивным типом.
В книге сказано это? Какая книга?
Я разработчик Java, и я понимаю, что примитивные типы данных не имеют операций, только классы.
Просто и просто, С# и Java - разные языки. В С# существует понятие object
, из которого происходит почти все (да, есть исключения, наиболее важным из которых является интерфейс). Из object
существует производный тип, называемый ValueType
. Производные ValueType
являются struct
, которые имеют семантику значений. Все остальные производные object
являются ссылочными типами. Все эти object
инкапсулируют данные и поведение (т.е. Могут иметь методы).
string name = "alex";
Console.WriteLine(name.ToUpper());
Как это возможно?
Я не понимаю вашу путаницу с этим фрагментом кода. name
- это экземпляр string
, который определенно назначается строковым литералом "alex"
, и мы вызываем одну из перегрузок метода String.ToUpper
на name
. Затем вызывается перегрузка Console.WriteLine
, которая принимает экземпляр string
. Вы даже можете сделать это
Console.WriteLine("alex".ToUpper());
Являются ли они действительно примитивными?
Нет. string
не является примитивным.
Что мне здесь не хватает?
Что С# и Java являются родственными, но очень разными языками программирования.