是一个原始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.UInt16
(UShort
) -
System.Int16
(Short
) -
System.UInt32
(UInteger
) -
System.Int32
(Integer
) -
System.UInt64
(ULong
) -
System.Int64
(Long
) -
System.Single
-
System.Double
-
System.Decimal
-
System.Boolean
-
System.DateTime
(Date
) -
System.Char
-
System.String
-
-
C#规范(版本4)为某些types定义了关键字别名,还定义了为某些值指定文字的方式; 它还分别定义了在常量expression式中可用的types; C#所具有的“原始types”最接近于4.1.4节中简单types的概念。 (“原始”一词在600页的文档中只用了两次); 这些基本types被简单地定义为“在C#中具有关键字别名的值types” – 在该部分中没有提到
string
:-
System.SByte
(sbyte
) -
System.Byte
(byte
) -
System.Int16
(short
) -
System.UInt16
(ushort
) -
System.Int32
(int
) -
System.UInt32
(uint
) -
System.Int64
(long
) -
System.UInt64
(ulong
) -
System.Char
(char
) -
System.Single
(float
) -
System.Double
(double
) -
System.Boolean
(bool
) -
System.Decimal
(decimal
)
-
你会看到所有这些东西之间只有部分重叠。 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,但是从更一般的意义上说,它不是。
他们不是,因为他们是字符序列