为什么C#中的原始类型有自己的操作?

几天前,我决定开始学习C#。 所以,我得到了一本书,开始阅读和练习代码。 当我看到C#中的string被认为是原始类型时,我感到很惊讶。

但是当我看到该string以及C#中的所有其他原始类型都有操作时,我更感到惊讶。 我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有。 但在C#中,以下内容有效:

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

这怎么可能? 他们真的是原始人吗? 我在这里想念的是什么?

string不是C#中的原始类型。 它是C#中两个预定义(即语言规范的一部分)引用类型之一(另一个是object )。 C#中的原始类型是Booleanbool ), Bytebyte ), SBytesbyte ), Int16short ), UInt16Int32int ),UInt32( uint ), Int64long ),UInt64( ulong ), IntPtrUIntPtrCharchar ), Doubledouble )和Singlesingle )。 请注意,规范声明“也可以使用结构和运算符重载来实现C#语言中的新”原语“类型”但是,如果MyStruct是用户定义的struct ,那么typeof(MyStruct).IsPrimitivefalse

我有一本书,开始阅读和练习代码。 当我看到C#中的字符串被认为是原始类型时,我感到很惊讶。

书上说这个? 哪本书?

我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有。

简单而言,C#和Java是不同的语言。 在C#中,存在几乎所有东西都来自的object的概念(是的,有一些例外,其中最重要的是接口)。 从object有一个名为ValueType的派生类型。 ValueType衍生物是具有值语义的结构。 object所有其他派生词都是引用类型。 所有这些object封装了数据和行为(即,它们可以有方法)。

string name = "alex";

Console.WriteLine(name.ToUpper());

这怎么可能?

我不明白你对这段代码的困惑。 namestring实例,由字符串文字"alex"明确赋值,我们在name上调用方法String.ToUpper的重载之一。 然后调用接受string实例的Console.WriteLine的重载。 你甚至可以这样做

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

他们真的是原始人吗?

编号string不是原始的。

我在这里想念的是什么?

C#和Java是相关但非常不同的编程语言。

在C#中, string是一个类 – 它是System.String的别名。

但是,.NET中的所有类型都有方法。 它是真正面向对象的,并且所有东西都派生自System.Object,这也意味着System.Object的方法适用于C#中的每个类型

简短的回答是,他们并不是真正的原始人。 编译器将使用String对象切换出您的string

由于C#将所有原始数据类型表示为对象,因此可以在原始数据类型上调用对象方法。 (来源: MSDN – 数据类型 – C#vs Java )

它们与.Net中匹配的系统命名空间类型别名。 这是.Net中值类型的别名列表的概述:

  • bool = System.Boolean
  • byte = System.Byte
  • char = System.Char
  • decimal = System.Decimal
  • double = System.Double
  • enum = System.Enum
  • float = System.Single
  • int = System.Int32
  • long = System.Int64
  • sbyte = System.SByte
  • short = System.Int16
  • uint = System.UInt32
  • ulong = System.UInt64
  • ushort = System.UInt16