Почему примитивные типы в С# имеют свои собственные операции?

Несколько дней назад я решил начать изучение С#. Итак, я получил книгу и начал читать и практиковать с кодом. Я был удивлен, когда увидел, что string в С# считается примитивным типом.

Но я был более удивлен, когда увидел, что string, а также все другие примитивные типы в С# имеют операции. Я разработчик Java, и я понимаю, что примитивные типы данных не имеют операций, только классы. Но в С# справедливо следующее:

string name = "alex";
Console.WriteLine(name.ToUpper());

Как это возможно? Действительно ли они примитивны? Что мне здесь не хватает?

Ответы

Ответ 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 являются родственными, но очень разными языками программирования.

Ответ 2

string, в С#, это класс - это псевдоним для System.String.

Однако все типы в .NET имеют методы. Он действительно объектно ориентирован, и все происходит от System.Object, что также означает, что методы для System.Object работают на каждом типе в С#.

Ответ 3

Короткий ответ, что они на самом деле не примитивы. Компилятор отключит ваш string с помощью объекта string.

Ответ 4

Так как С# представляет все примитивные типы данных как объекты, можно вызвать метод объекта в примитивном типе данных. (Источник: MSDN - Типы данных - С# vs Java)

Ответ 5

Они схожи с их соответствующими типами системного пространства имен в .Net. Здесь приведен список псевдонимов для типов значений в .Net: