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

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

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

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

Как это возможно? Они - действительно примитивы? Что я пропускаю здесь?

16
задан Charlie Salts 21 January 2010 в 00:43
поделиться

5 ответов

строка не является примитивным типом в C #. Это один из двух предопределенных (т.е. часть спецификации языка) ссылочных типов в C # (другой - объект ). В C # примитивными типами являются 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 ). Обратите внимание, что в спецификации указано, что «также можно использовать структуры и перегрузку операторов для реализации новых« примитивных »типов в языке C #», но что typeof (MyStruct) .IsPrimitive равно false , если MyStruct является определяемой пользователем структурой .

Я получил книгу и начал читать и практиковаться с кодом. Я был удивлен, когда увидел, что строка в C # считается примитивным типом.

В книге это сказано? Какая книга?

Я разработчик Java и, как я понял, примитивные типы данных не имеют операций, а имеют только классы.

Проще говоря, C # и Java - разные языки.В C # есть понятие объекта , от которого происходит почти все (да, есть исключения, наиболее важным из которых являются интерфейсы). От объекта есть производный тип с именем ValueType . Производными от ValueType являются структуры struct , которые имеют семантику значений. Все остальные производные от объекта являются ссылочными типами. Все эти объекты инкапсулируют данные и поведение (т. Е. Могут иметь методы).

string name = "alex";

Console.WriteLine (name.ToUpper ());

Как это возможно?

Я не понимаю, что вы запутались с этим фрагментом кода. name - это экземпляр string , который определенно назначается строковым литералом «alex» , и мы вызываем одну из перегрузок метода String .ToUpper на имя . Затем вызывается перегрузка Console.WriteLine , которая принимает экземпляр string . Вы даже можете сделать это

Console.WriteLine("alex".ToUpper());

Они действительно примитивны?

Нет. строка не является примитивом.

Что мне здесь не хватает?

Что C # и Java связаны, но очень разные языки программирования.

31
ответ дан 30 November 2019 в 15:17
поделиться

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

-121--2364350-

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

6
ответ дан 30 November 2019 в 15:17
поделиться

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

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

15
ответ дан 30 November 2019 в 15:17
поделиться

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

5
ответ дан 30 November 2019 в 15:17
поделиться

Они псевдонимы к их соответствующим типам пространства имен систем в .NET. Вот наклон списка псевдонимов для типов значений в .NET:

5
ответ дан 30 November 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: