Почему примитивные типы в C # имеют свои собственные операции? - PullRequest
15 голосов
/ 21 января 2010

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

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

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

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

Ответы [ 5 ]

30 голосов
/ 21 января 2010

string не является примитивным типом в C #. Это один из двух предопределенных (то есть, часть спецификации языка) ссылочных типов в C # (другой - object). Типы примитивов в 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 определено пользователем struct.

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

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

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

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

string name = "alex";

Console.WriteLine(name.ToUpper());

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

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

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

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

Нет. string не примитив.

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

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

14 голосов
/ 21 января 2010

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

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

5 голосов
/ 21 января 2010

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

4 голосов
/ 21 января 2010

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

4 голосов
/ 21 января 2010

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

...