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

时间:2010-01-21 00:37:23

标签: c# primitive-types

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

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

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

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

5 个答案:

答案 0 :(得分:30)

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

  

我有一本书,开始阅读和练习代码。当我看到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)

在C#中,

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