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

Ale*_*lex 16 c# primitive-types

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

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

string name = "alex";
Console.WriteLine(name.ToUpper());
Run Code Online (Sandbox Code Playgroud)

这怎么可能?他们真的是原始人吗?我在这里错过了什么?

jas*_*son 31

string在C#中不是原始类型.它是C#中两个预定义(即语言规范的一部分)引用类型之一(另一个是object).原始类型在C#是Boolean(bool), (Byte),byte( ),SByte(sbyte),Int16,short UInt16(Int32),UInt32int的(uint), (Int64),UINT64(long ),ulong, ,IntPtr(),UIntPtr (),和().需要注意的是规范规定"也可以使用结构和运算符重载实施新的'’在C#语言类型"原始但这是,如果是用户定义的.CharcharDoubledoubleSinglesingletypeof(MyStruct).IsPrimitivefalseMyStructstruct

我有一本书,开始阅读和练习代码.当我看到C#中的字符串被认为是原始类型时,我感到很惊讶.

书上说这个?哪本书?

我是一名Java开发人员,我的理解是原始数据类型没有操作,只有类有.

简单而言,C#和Java是不同的语言.在C#中object,几乎所有东西都是从中得出的(是的,有一些例外,其中最重要的是接口).从中object有一个名为的派生类型ValueType.衍生物ValueTypestruct具有值语义秒.所有其他衍生物object都是参考类型.所有这些都object封装了数据和行为(即,它们可以有方法).

string name = "alex";

Console.WriteLine(name.ToUpper());

这怎么可能?

我不明白你对这段代码的困惑.name是的实例string是肯定由字符串字面分配"alex",我们调用方法的重载之一String.ToUppername.然后调用Console.WriteLine接受实例的重载string.你甚至可以这样做

Console.WriteLine("alex".ToUpper());
Run Code Online (Sandbox Code Playgroud)

他们真的是原始人吗?

string不是原始.

我在这里错过了什么?

C#和Java是相关但非常不同的编程语言.

  • 你是对的,经过一些研究(并在这里阅读你的所有答案)后,我发现C#中没有任何原语.我没有对代码感到困惑,我只是觉得你被允许在int这样的类型中执行操作.例如,int i = 5; i.ToString(); (4认同)
  • `ToString`是在`object`类上定义的`virtual`方法,`ValueType`派生自`Int32`派生(`int`是C#中的保留关键字,它是`Int32`的缩写).`Int32`提供`ToString`的`覆盖`. (3认同)

Ree*_*sey 15

string在C#中,是一个类 - 它是System.String的别名.

但是,.NET中的所有类型都有方法.它确实是面向对象的,并且所有东西都派生自System.Object,这也意味着System.Object方法适用于C#中的每个类型.

  • 小心!并非所有东西都来自`System.Object`! (3认同)
  • @divo:例如指针类型和接口。 (2认同)

Dan*_*llo 6

由于C#将所有原始数据类型表示为对象,因此可以在原始数据类型上调用对象方法.(来源:MSDN - 数据类型 - C#vs Java)


Nic*_*ver 5

它们是.Net中与其匹配的系统命名空间类型的别名。这是.Net中值类型的别名列表的摘要:


Alc*_*nja 5

简短的回答是,它们并不是真正的原始类型。编译器将string用一个String对象切换出您。