为什么C#中的基元类型有自己的操作?
几天前,我决定开始学习C。所以,我买了一本书,开始阅读和练习代码。当我看到C#中的为什么C#中的基元类型有自己的操作?,c#,primitive-types,C#,Primitive Types,几天前,我决定开始学习C。所以,我买了一本书,开始阅读和练习代码。当我看到C#中的string被认为是一种基本类型时,我感到惊讶 但是当我看到string,以及C#中的所有其他基本类型都有操作时,我更加惊讶了。我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有操作。但在C#中,以下内容是有效的: string name = "alex"; Console.WriteLine(name.ToUpper()); 这怎么可能?他们真的是原始人吗?我在这里缺少什么?它们在.Net中被别
string
被认为是一种基本类型时,我感到惊讶
但是当我看到string
,以及C#中的所有其他基本类型都有操作时,我更加惊讶了。我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有操作。但在C#中,以下内容是有效的:
string name = "alex";
Console.WriteLine(name.ToUpper());
这怎么可能?他们真的是原始人吗?我在这里缺少什么?它们在.Net中被别名为匹配的系统命名空间类型。下面是.Net中值类型的别名列表的摘要:
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
- =
字符串
,在C#中,是一个类-它是的别名
但是,.NET中的所有类型都有方法。它是真正的面向对象的,一切都源于System.object,这也意味着C#中的每种类型的工作都不是真正的原语。编译器将使用
字符串
对象切换出字符串
。由于C#将所有基本数据类型表示为对象,因此可以对基本数据类型调用对象方法。(来源:)string
不是C#中的基元类型。它是C#中两种预定义(即语言规范的一部分)引用类型之一(另一种是object
)。C语言中的基本类型有Boolean
(bool
)、Byte
(Byte
)、SByte
(SByte
)、Int16
(short
)、UInt16
、UInt16
(int
)、UInt32(int
)、UInt32(,IntPtr
、UIntPtr
、Char
(Char
)、Double
(Double
)和Single
(Single
)。
请注意,该规范声明“也可以使用structs和operator
重载以在C语言中实现新的“基元”类型,但是typeof(MyStruct)。如果MyStruct
是用户定义的struct
,则IsPrimitive
为false
我买了一本书,开始阅读和练习代码。当我看到C#中的字符串被认为是一种基本类型时,我感到惊讶
书上是这么说的?哪本书
我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有操作
简单明了地说,C#和Java是不同的语言。在C#中有object
的概念,几乎所有东西都是从它派生出来的(是的,也有例外,其中最重要的是接口)。从object
中有一个派生类型,名为ValueType
。ValueType
的派生是具有值语义的struct
s。对象
的所有其他派生都是引用类型。所有这些object
s都封装了数据和行为(也就是说,它们可以有方法)
string name=“alex”代码>
Console.WriteLine(name.ToUpper())代码>
这怎么可能
我不理解你对这个代码片段的混淆name
是string
的一个实例,它由string literal“alex”
指定,我们正在调用name
上的方法string.ToUpper
的一个重载。然后调用接受string
实例的Console.WriteLine
重载。你甚至可以这样做
Console.WriteLine("alex".ToUpper());
他们真的是原始人吗
否。字符串
不是基元
我错过了什么
C#和Java是相关的,但非常不同的编程语言。没有字符串的装箱/拆箱,它是一种引用类型。@Bruno Reis:谢谢你的关注,我经常忘记这一点,添加了执行box/unbox操作的完整引用,以防对以后的人有所帮助。仍然错误:装箱是将值类型视为对象
。如前所述,Int32与int相同。如果将int
强制转换为Int32
,则绝对不会发生装箱。装箱正在转换为对象。您的列表描述了类型别名,但它与装箱/取消装箱完全无关。您应该回顾这些概念。仅供参考,任何值类型都要进行装箱/拆箱,即使是您自己定义的“自定义”值类型。你所描述的是一个与装箱/拆箱完全无关的概念。@Bruno Reis:谢谢!,我一直认为它在一个(Int32)int场景中解除了绑定,将其粘贴在堆栈上进行方法调用,但我看到我们生成的IL并没有…每天都在这里学到一些东西。我更新了这个,以防以后有人被它绊倒。我很欣赏这一课,我相信它会对今后的项目有所帮助。你是对的,经过一番研究(并在这里阅读了你所有的答案),我发现C#中没有任何原语。我并没有对代码感到困惑,我只是对允许您执行int等类型的操作感到困惑;i、 ToString()ToString
是在类对象上定义的virtual
方法,ValueType
从中派生Int32
从中派生(int
是C中的保留关键字,是Int32
的缩写)Int32
提供了一个覆盖ToString
+1非常好的答案。(顺便说一句,这里是对您的断言的快速验证,String
不是基本类型:typeof(String.IsPrimitive
)值得在