Несколько дней назад я решил начать изучать C#. Так, я получил книгу и начал читать и практиковать с кодексом. Я был удивлен, когда я видел это string
в C# считается примитивным типом.
Но я был более удивлен, когда я видел это string
, а также все другие примитивные типы в C# начинают операции. Я - Java-разработчик, и мое понимание было то, что примитивные типы данных не начинают операции, только классы имеют. Но в C#, следующее действительно:
string name = "alex";
Console.WriteLine(name.ToUpper());
Как это возможно? Они - действительно примитивы? Что я пропускаю здесь?
строка
не является примитивным типом в 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 связаны, но очень разные языки программирования.
Краткий ответ - это то, что они на самом деле не примитивы. Компилятор выключит вашу строку
с помощью объекта
.
Поскольку C # представляет все примитивные типы данных в качестве объектов, можно вызвать метод объекта в примитивном типе данных. (Источник: MSDN - Типы данных - C # VS Java )
string
, в C# - это класс - это псевдоним для System.String.
Однако, все типы в .NET имеют методы. Он действительно объектно-ориентирован, и все происходит от System.Object, что также означает, что методы System.Object работают на каждом типе в C#.
Короткий ответ: они не совсем примитивны. Компилятор выключит ваш string
с помощью объекта String
.
Они псевдонимы к их соответствующим типам пространства имен систем в .NET. Вот наклон списка псевдонимов для типов значений в .NET: