我对字符串和原始类型感到好奇。文章像这样说字符串是基本类型。但是,有关MSDN的第二篇文章并未将字符串列为原始类型。
但是,当我运行第二篇文章中提供的代码时,它显示String不是Primitive type。
有人可以指导我吗?
Answers:
这两篇文章都说字符串不是原始类型。不是。
如果编译并运行第二篇文章中的示例代码,它将打印:
字符串不是原始类型。
我认为对此感到困惑的是,创建新字符串的语法类似于创建值类型。
在定义值类型时,所有这些都是相等的(无论如何在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
这仍然不会使字符串成为原始类型。
该问题的公认答案应为您提供详细信息。
没有关于基本类型的“ Microsoft”定义。
在给定的上下文中只有原始类型的定义。
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
是它自己非常特别的雪花;String
“只是另一种引用类型”。字符串和数组是唯一其大小不受其类型暗示的对象。此外,我相信string是运行时在加载程序集时会自动生成包含该程序集中存储的数据的实例的唯一类型。
IsPrimitive
函数具有相同的行为,无论从哪种.NET语言调用它,它都是CLR定义。
立场变更更新:否,因为代码没有说谎
Console.WriteLine(typeof(string).IsPrimitive); => False
Console.WriteLine(typeof(int).IsPrimitive); => True
-----更新结束。
但是一些在线文档似乎将String视为原始类型。我认为是-基于以下“原始”定义。(我的个人定义将是无法进一步细分为组件类型的类型。但是我想我们在这里只是“学究”,对我来说这大部分不是问题。)
C#中的所有原始数据类型都是System名称空间中的对象。对于每种数据类型,都提供了简称或别名。
来源:http : //msdn.microsoft.com/zh-cn/library/ms228360%28VS.80%29.aspx 另一篇赞成的文章-MSDN Mag文章
简介:我想答案取决于您对基本类型的定义,该定义不是明确定义的。来源:Eric Lippert在另一个SO线程上。
System
名称空间中的所有类型都是基元(我可以System
在程序集中的名称空间中添加类型,所以它们将成为基元吗?),它只是说明所有现有的基元类型都可以在System
其他地方找到。
.NET定义(摘自您的文章):
基本类型为布尔,字节,字节,Int16,UInt16,Int32,UInt32,Int64,UInt64,Char,Double和Single。
所以不行。内置且非常重要:是的,但不是原始的。
VB使用的定义似乎与CLI和C#略有不同。
根据Microsoft对“原始”的定义,字符串不被视为原始类型。另一方面,Microsoft倾向于使用术语而不真正制定清晰或一致的定义(例如“非托管资源”),并且可以有效地将“原始”定义为包括“字符串”,“数组”和“对象”,因为如果没有它们,将无法定义可以有效模拟它们的类型。
DateTime
是原始的,按照我的观点也可以。
不,字符串不是原始类型。
但是,它具有原始类型共有的一些特征。
该语言在代码中支持字符串文字,因此您不必String
使用new
关键字显式创建实例即可获取字符串对象。
还支持使用+
运算符连接字符串,编译器将其转换为对该String.Concat
方法的调用。
字符串是不可变的,这意味着它在大多数情况下都具有值类型语义,就像原始类型一样。
字符串是一种特殊的原始类型。它不是值类型,但是可以视为原始类型,因为可以通过编写文字(例如/“ hello”)来创建它,并且可以声明字符串类型的常量。话虽如此,IsPrimitive的值返回false
Console.WriteLine("hello".GetType().IsPrimitive) // output = False
编辑:我想在这里取回我的答案。从技术上讲,它不是原始类型,但是具有我上面提到的属性。