为什么C#中的原始类型有自己的操作?
几天前,我决定开始学习C#。 所以,我得到了一本书,开始阅读和练习代码。 当我看到C#中的string
被认为是原始类型时,我感到很惊讶。
但是当我看到该string
以及C#中的所有其他原始类型都有操作时,我更感到惊讶。 我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有。 但在C#中,以下内容有效:
string name = "alex"; Console.WriteLine(name.ToUpper());
这怎么可能? 他们真的是原始人吗? 我在这里想念的是什么?
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#语言中的新”原语“类型”但是,如果MyStruct
是用户定义的struct
,那么typeof(MyStruct).IsPrimitive
为false
。
我有一本书,开始阅读和练习代码。 当我看到C#中的字符串被认为是原始类型时,我感到很惊讶。
书上说这个? 哪本书?
我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有。
简单而言,C#和Java是不同的语言。 在C#中,存在几乎所有东西都来自的object
的概念(是的,有一些例外,其中最重要的是接口)。 从object
有一个名为ValueType
的派生类型。 ValueType
衍生物是具有值语义的结构。 object
所有其他派生词都是引用类型。 所有这些object
封装了数据和行为(即,它们可以有方法)。
string name = "alex";
Console.WriteLine(name.ToUpper());
这怎么可能?
我不明白你对这段代码的困惑。 name
是string
实例,由字符串文字"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