我很好奇字符串和原始类型。像this这样的文章说字符串是原始类型。但是,MSDN上的second article不会将字符串列为基本类型。
但是,当我运行第二篇文章中提供的代码时,它显示字符串不是原始类型。
任何人都可以指导我吗?
答案 0 :(得分:43)
两篇文章都说字符串 NOT 是一种原始类型。它不是。
如果您编译并运行第二篇文章中的示例代码,则会打印:
string不是原始类型。
我认为对此的困惑是,创建新字符串的语法类似于创建值类型。
定义值类型时,所有这些都是相同的(无论如何在32位系统上)
System.Int32 a = new System.Int32(5);
System.Int32 a = 5;
int a = 5;
在创建引用类型字符串时就像这些:
System.String s = new System.String(new char[]{'h', 'e', 'l', 'l', 'o'});
System.String s = "hello";
string s = "hello";
我们也可以按值比较字符串,即使它们是引用类型:
s == "hello";//true
这仍然不会使字符串成为基本类型。
此question的已接受答案应该为您提供详细信息。
答案 1 :(得分:42)
没有“微软”对原始类型的定义。
在给定的上下文中只有原始类型的定义。
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
System
命名空间的情况下使用该类型),一种用文字定义该类型实例的方法;并允许使用这些类型作为常数; VB.NET中的原始类型是:
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)定义了某些类型的关键字别名,并定义了为某些值指定文字的方法;它还单独定义了常量表达式中可用的类型;与C#具有的“原始类型”最接近的概念在4.1.4节:简单类型中。 (“原始”一词仅在600页文件中使用两次);这些原始类型简单地定义为“在C#中具有关键字别名的值类型” - 在该部分中未提及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将两种指针类型视为原始类型,VB.NET和C#都将十进制视为原始/简单类型,只有VB.NET将DateTime视为特殊的,VB.NET和C#都有一个关键字别名和字符串的字面语法但只有VB.NET将String
指定为“原始类型”,而C#只是将其规范的一部分专用于System.String
......
总之:不同的上下文对“原始类型”的定义有不同的定义。没关系 - 只是学习如何使用你的编程语言,在战斗和思考这些多态词时没有任何意义。就个人而言,我想知道为什么财产Type.IsPrimitive
甚至存在。
至于System.String
:
String
是它自己非常特别的雪花; 答案 2 :(得分:10)
更改站点更新:否,因为代码不存在
Console.WriteLine(typeof(string).IsPrimitive); => False
Console.WriteLine(typeof(int).IsPrimitive); => True
-----更新结束。
但是在线的一些文档似乎将String视为原语。我认为是 - 基于以下“原始”的定义。 (我的个人定义是一种不能进一步分解为组件类型的类型。但我想我们在这里只是'迂腐',对我来说这绝对不是问题。)
C#中的所有原始数据类型都是 System命名空间中的对象。对于 每种数据类型,简称或 别名,提供。
来源:http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx 另一篇赞成的文章 - MSDN Mag article
总结:我猜答案取决于你的原语的定义,这个定义没有明确定义。 资料来源:Eric Lippert on another SO thread.
答案 3 :(得分:6)
.NET定义(来自您的文章):
基本类型包括Boolean,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Char,Double和Single。
所以没有。内置且非常重要:是的,但不是原始的。
VB对CLI和C#的定义略有不同。
答案 4 :(得分:3)
不,字符串不是原始类型。
但是,它具有与原始类型相同的一些特征。
该语言支持代码中的字符串文字,因此您不必使用String
关键字显式创建new
实例来获取字符串对象。
还支持使用+
运算符连接字符串,编译器将其转换为对String.Concat
方法的调用。
字符串是不可变的,这意味着它在大多数情况下都具有值类型语义,就像原始类型一样。
答案 5 :(得分:3)
根据Microsoft对“primitive”的定义,string不被视为原始类型。另一方面,Microsoft倾向于使用术语而不真正制定明确或一致的定义(例如“非托管资源”),并且可以有用地定义“原始”以包括“String”,“Array”和“Object”,因为在他们缺席的情况下,没有办法定义可以有效模仿它们的类型。
答案 6 :(得分:1)
String是一种特殊的基本类型。它不是值类型,但可以被认为是原始类型,因为它可以通过编写文字来创建,例如/“hello”,并且可以声明类型字符串的常量。话虽如此,IsPrimitive的值返回false
Console.WriteLine("hello".GetType().IsPrimitive) // output = False
编辑:我想在这里收回我的答案。它在技术上不是原始类型,但共享我上面提到的属性。
答案 7 :(得分:1)
在c#中,类型主要定义为两种类型:值类型和基本类型。
首先在C#中查看原始类型的definition。
另一方面,所有原始数据 C#中的类型是系统中的对象 命名空间。对于每种数据类型,简短 提供名称或别名。对于 instance是int的简称 System.Int32和double是简短的 System.Double的形式。
现在,请阅读本文,了解差异:Primitive Types & Value Types
System.String
映射到“string
”,这是CLI中的基本类型。 但实际上,值类型是堆栈中的值,而不是堆空间中的值。
因此,关键是值类型与原始类型。通过微软对原语的定义,它是一种原始类型,但从更广泛的意义上讲,它不是。
答案 8 :(得分:0)
字符串是引用类型。要验证这一点,请对字符串执行F12键。
答案 9 :(得分:-1)
它们不是,因为它们是字符序列