几天前,我决定开始学习C#。所以,我得到了一本书,开始阅读和练习代码。当我看到C#中的string
被认为是原始类型时,我感到很惊讶。
但是当我看到string
以及C#中的所有其他原始类型都有操作时,我更加惊讶。我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有。但在C#中,以下内容有效:
string name = "alex";
Console.WriteLine(name.ToUpper());
这怎么可能?他们真的是原始人吗?我在这里缺少什么?
答案 0 :(得分:30)
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
)和{{1 (Single
)。
请注意,规范声明“也可以使用结构和运算符
重载以在C#语言中实现新的“原始”类型“但如果single
是用户定义的typeof(MyStruct).IsPrimitive
,则false
为MyStruct
。
这本书怎么说?哪本书?我有一本书,开始阅读和练习代码。当我看到C#中的字符串被认为是原始类型时,我感到很惊讶。
我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有。
简单而言,C#和Java是不同的语言。在C#中,存在struct
的概念,几乎所有内容都是从中导出的(是的,有一些例外,其中最重要的是接口)。从object
开始,有一个名为object
的派生类型。 ValueType
的导数是ValueType
s,它们具有值语义。 struct
的所有其他衍生物都是引用类型。所有这些object
都封装了数据和行为(即,它们可以有方法)。
object
string name = "alex";
这怎么可能?
我不明白您对此代码段的困惑。 Console.WriteLine(name.ToUpper());
是name
的一个实例,它由字符串文字string
明确分配,我们在"alex"
上调用方法String.ToUpper
的一个重载。然后调用接受name
实例的Console.WriteLine
的重载。你甚至可以这样做
string
他们真的是原始人吗?
没有。 Console.WriteLine("alex".ToUpper());
不是原始的。
我在这里缺少什么?
C#和Java是相关但却截然不同的编程语言。
答案 1 :(得分:14)
string
是一个类 - 它是System.String的别名。
但是,.NET中的所有类型都有方法。它确实是面向对象的,并且所有内容都来自System.Object,这也意味着methods of System.Object可以在C#中使用每种类型。
答案 2 :(得分:5)
由于C#将所有原始数据类型表示为对象,因此可以在原始数据类型上调用对象方法。 (来源:MSDN - Data Types - C# vs Java)
答案 3 :(得分:4)
它们与.Net中匹配的系统命名空间类型别名。这是.Net中值类型的别名列表的概述:
答案 4 :(得分:4)
简短的回答是,他们并不是真正的原始人。编译器将使用string
对象切换出String
。