是一个原始types的string?

我很好奇string和原始types。 像这样的文章说的string是原始types。 但是MSDN上的第二篇文章并没有列出string为原始types。

但是,当我运行第二篇文章中提供的代码时,它显示的string不是原始types

任何人都可以指导我吗?

两篇文章都说这个string不是原始types。 这不是。

如果编译并运行第二篇文章中的示例代码,它将打印:

string不是原始types。

我认为这个混乱是,创build一个新的string的语法类似于创build值types。

当定义一个值types时,所有这些都是相同的(反正在32位系统上)

System.Int32 a = new System.Int32(5); System.Int32 a = 5; int a = 5; 

就像创build引用typesstring时一样:

 System.String s = new System.String(new char[]{'h', 'e', 'l', 'l', 'o'}); System.String s = "hello"; string s = "hello"; 

我们也可以通过值比较string,即使它们是引用types:

 s == "hello";//true 

这仍然不会使string成为原始types。

这个问题的接受答案应该给你详细的。

什么是原始types没有“微软”的定义。

在给定的上下文中只有基本types的定义。

  • CLR将原始types定义为无非是:
    • System.Boolean
    • System.Byte
    • System.SByte
    • System.Int16
    • System.UInt16
    • System.Int32
    • System.UInt32
    • System.Int64
    • System.UInt64
    • System.IntPtr
    • System.UIntPtr
    • System.Char
    • System.Double
    • System.Single
  • VB.NET规范版本10(7.3节)定义了“原始types”是types的关键字别名(因此允许使用该types而不导入System名称空间),一种定义键入一个文字; 并允许使用这些types作为常量; VB.NET中的原始types是:
    • System.Byte
    • System.SByte
    • System.UInt16UShort
    • System.Int16Short
    • System.UInt32UInteger
    • System.Int32Integer
    • System.UInt64ULong
    • System.Int64Long
    • System.Single
    • System.Double
    • System.Decimal
    • System.Boolean
    • System.DateTimeDate
    • System.Char
    • System.String
  • C#规范(版本4)为某些types定义了关键字别名,还定义了为某些值指定文字的方式; 它还分别定义了在常量expression式中可用的types; C#所具有的“原始types”最接近于4.1.4节中简单types的概念。 (“原始”一词在600页的文档中只用了两次); 这些基本types被简单地定义为“在C#中具有关键字别名的值types” – 在该部分中没有提到string

    • System.SBytesbyte
    • System.Bytebyte
    • System.Int16short
    • System.UInt16ushort
    • System.Int32int
    • System.UInt32uint
    • System.Int64long
    • System.UInt64ulong
    • System.Charchar
    • System.Singlefloat
    • System.Doubledouble
    • System.Booleanbool
    • System.Decimaldecimal

你会看到所有这些东西之间只有部分重叠。 CLR将这两种指针types都视为原始types,VB.NET和C#都将decimal指定为基本/简单types,只有VB.NET将DateTime视为任何特殊的东西,VB.NET和C#都具有关键字别名和string的文字语法但只有VB.NET指定String为“原始types”,而C#只是一个专用于System.String规范部分…

总之:不同的语境对“原始types”有不同的定义。 没关系 – 只要学习如何使用你的编程语言,对这种多态词汇的争斗和思考是没有意义的。 就个人而言,我不知道为什么Type.IsPrimitive属性甚至存在。

至于System.String

  • CLR:没什么特别的,只是一个引用types;
  • VB.NET:这是一个原始types;
  • C#: String是它自己特别的雪花;

更改立场更新:否,因为代码不说谎

 Console.WriteLine(typeof(string).IsPrimitive); => False Console.WriteLine(typeof(int).IsPrimitive); => True 

—–更新结束。
但是一些在线文档似乎把String当作一个原始对象。 我认为 – 基于以下“原始”的定义。 (我的个人定义是一种不能被进一步分解为组件types的types,但我想我们在这里只是“迂腐的”,这对大部分我来说不是问题)。

C#中的所有基本数据types都是System命名空间中的对象。 对于每种数据types,都提供一个短名称或别名。

资料来源: http : //msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx另一篇文章赞成 – MSDN Mag文章

总结:我想答案取决于您的原始定义,这是不明确的定义 。 来源: Eric Lippert在另一个SO线程。

.NET定义(从你的文章):

原始types是布尔,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Char,Double和Single。

所以不行。 内在和非常重要的:是的,但不是原始的。

VB使用一个稍微不同的定义来CLI和C#似乎。

在微软的“原始”定义下,string不被视为原始types。 另一方面,微软倾向于使用术语而没有真正地制定明确的或一致的定义(例如“非托pipe资源”),并且可以有用地将“基元”定义为包括“string”,“arrays”和“对象”在他们缺席的情况下,将无法定义可以高效仿效的types。

不,string不是原始types。

但是它有一些与原始types相同的特征。

该语言支持代码中的string文字,因此您不必使用new关键字显式创buildString实例来获取string对象。

还支持使用+运算符连接string,编译器将其转换为对String.Concat方法的调用。

string是不可变的,这意味着它在大多数情况下都具有值types语义,就像基本types一样。

string是一种特殊的原始types。 它不是一个值types,但可以被认为是一个原始types,因为它可以通过编写文字创build,例如/“hello”,并且可以声明一个stringtypes的常量。 话虽如此,IsPrimitive的值返回false

 Console.WriteLine("hello".GetType().IsPrimitive) // output = False 

编辑:我想收回我的答案在这里。 从技术上讲,这不是一个原始types,而是共享我上面提到的属性。

在c#中,types主要定义为两种types:值types和基本types。

首先看C#中原始types的定义 。

另一方面,C#中的所有基本数据types都是System命名空间中的对象。 对于每种数据types,都提供一个短名称或别名。 例如,int是System.Int32的简称,double是System.Double的简写forms。

现在,阅读这篇文章的区别: 原始types和值types

System.String映射到“ string ”,这是CLI中的一种基本types。 但在现实中,价值types是堆栈而不是堆空间的价值types。

所以,关键是值types与原始types 。 按照微软对原始的定义,它是一个原始types,但是从更一般的意义上说,它不是。

他们不是,因为他们是字符序列