String 是基元类型吗?

我对字符串和基本类型很好奇。像 这个这样的文章说字符串是原始类型。但是,MSDN 上的 第二篇文章不将字符串列为基元类型。

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

有人能指导我吗?

61012 次浏览

两篇文章都说字符串是 没有基元类型,但实际上不是。

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

字符串不是基元类型。

我认为这个问题的困惑之处在于,创建新字符串的语法类似于创建值类型。

当定义一个值类型时,所有这些都是相等的(无论如何在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

这仍然不能使字符串成为基元类型。

The accepted answer to this 有个问题 should give you details on that.

.NET defines (from your article):

基元类型是 Boolean、 Byte、 SByte、 Int16、 UInt16、 Int32、 UInt32、 Int64、 UInt64、 Char、 Double 和 Single。

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

VB 似乎使用了与 CLI 和 C # 略有不同的定义。

更新: 不,因为代码不会说谎

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

——更新结束。
但是一些在线文档似乎将 String 视为原始文档。我认为 是的-基于以下“原始”的定义。(我个人的定义是一种类型,它不能进一步细分为组件类型。但我想我们只是在“迂腐”,这对我来说基本上不是问题。)

C # 中的所有基本数据类型都是 对象在系统命名空间中 每个数据类型、简称或 提供了别名。

来源: http://msdn.microsoft.com/en-us/library/ms228360% 28VS. 80% 29.aspx”rel = “ nofollow noReferrer”> http://msdn.microsoft.com/en-us/library/ms228360%28vs.80%29.aspx Another article in favor - MSDN Mag article

总结: 我想答案取决于你的 基元的定义,该基元的定义不是明确的。 来源: 埃里克 · 利伯特(Eric Lippert)在另一个 SO 帖子上。

不,字符串不是基元类型。

However, it has some characteristics common with the primitive types.

该语言在代码中支持字符串文字,因此不必使用 new关键字显式创建 String实例来获取字符串对象。

还支持使用 +操作符连接字符串,编译器将其转换为对 String.Concat方法的调用。

字符串是不可变的,这意味着它在大多数情况下具有值类型语义,就像原语类型一样。

String 是一种特殊的基元类型。它不是一个值类型,但可以被认为是一个基本类型,因为它可以通过写文字创建,例如/“ hello”,并且可以声明类型为 string 的常量。尽管如此,IsPrimitive 的值返回 false

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

编辑: 我想在这里收回我的回答。它在技术上不是一个原始类型,但是共享我上面提到的属性。

在 c # 中,类型主要定义为两种类型: 值类型和基元类型。

首先看看 C # 中基元类型的 定义

On the other hand, all primitive data C # 中的类型是系统中的对象 对于每种数据类型,一个简短的 提供了名称或别名 实例,int 是 System.Int32和 double 是短语 系统的形式。

现在,阅读这篇文章了解其中的区别: 基本类型和值类型

System.String映射到“ string”,这是 CLI.But in the reality, value types are the ones which go in the stack and not in the heap space.中的基元类型

关键是 值类型与基本类型。根据微软对原语的定义,它是一种原语类型,但在更一般的意义上,它不是。

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

根据微软对“原语”的定义,字符串不被视为原语类型。另一方面,微软倾向于使用术语而不真正制定一个清晰或一致的定义(例如“非托管资源”) ,人们可以有效地定义“原始”,包括“字符串”,“数组”,和“对象”,因为在他们不存在的情况下,没有办法定义类型,可以有效地模拟他们。

对于什么是基元类型,没有“ Microsoft”定义。

在给定的上下文中只有基元类型的定义。

  • 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.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)

You will see that there is only a partial overlap between all of these things; the CLR sees both pointer types as primitive, both VB.NET and C# see decimal as a primitive/simple type, only VB.NET sees DateTime as anything special, both VB.NET and C# have a keyword alias and a literal syntax for strings but only VB.NET specifies String as being a "primitive type", while C# simply has a section of its specification dedicated to System.String...

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

至于 System.String:

  • CLR: 没什么特别的,它只是一个引用类型;
  • VB.NET: 它是一个原始类型;
  • C#: String is its own very special snowflake;

字符串是一个引用类型。要验证这一点,请对字符串执行 F12。

enter image description here