为什么C#中的基元类型有自己的操作?

为什么C#中的基元类型有自己的操作?,c#,primitive-types,C#,Primitive Types,几天前,我决定开始学习C。所以,我买了一本书,开始阅读和练习代码。当我看到C#中的string被认为是一种基本类型时,我感到惊讶 但是当我看到string,以及C#中的所有其他基本类型都有操作时,我更加惊讶了。我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有操作。但在C#中,以下内容是有效的: string name = "alex"; Console.WriteLine(name.ToUpper()); 这怎么可能?他们真的是原始人吗?我在这里缺少什么?它们在.Net中被别

几天前,我决定开始学习C。所以,我买了一本书,开始阅读和练习代码。当我看到C#中的
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
    )值得在