String是原始类型吗?

时间:2010-10-19 06:13:36

标签: c# .net vb.net string primitive-types

我很好奇字符串和原始类型。像this这样的文章说字符串是原始类型。但是,MSDN上的second article不会将字符串列为基本类型。

但是,当我运行第二篇文章中提供的代码时,它显示字符串不是原始类型

任何人都可以指导我吗?

10 个答案:

答案 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)

没有“微软”对原始类型的定义。

在给定的上下文中只有原始类型的定义。

  • The CLR将原始类型定义为:
    • 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节中)将“原始类型”定义为具有该类型的关键字别名的类型(因此允许在不导入System命名空间的情况下使用该类型),一种用文字定义该类型实例的方法;并允许使用这些类型作为常数; VB.NET中的原始类型是:
    • 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)定义了某些类型的关键字别名,并定义了为某些值指定文字的方法;它还单独定义了常量表达式中可用的类型;与C#具有的“原始类型”最接近的概念在4.1.4节:简单类型中。 (“原始”一词仅在600页文件中使用两次);这些原始类型简单地定义为“在C#中具有关键字别名的值类型” - 在该部分中未提及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将两种指针类型视为原始类型,VB.NET和C#都将十进制视为原始/简单类型,只有VB.NET将DateTime视为特殊的,VB.NET和C#都有一个关键字别名和字符串的字面语法但只有VB.NET将String指定为“原始类型”,而C#只是将其规范的一部分专用于System.String ......

总之:不同的上下文对“原始类型”的定义有不同的定义。没关系 - 只是学习如何使用你的编程语言,在战斗和思考这些多态词时没有任何意义。就个人而言,我想知道为什么财产Type.IsPrimitive甚至存在。

至于System.String

  • CLR:没什么特别的,它只是一种参考类型;
  • VB.NET:它是一种原始类型;
  • C#: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键。

enter image description here

答案 9 :(得分:-1)

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