String是原始类型吗?

Ram*_*Ram 64 .net c# vb.net string primitive-types

我很好奇字符串和原始类型.像这样的文章说字符串是原始类型.但是MSDN上的第二篇文章没有将字符串列为基本类型.

但是,当我运行第二篇文章中提供的代码时,它显示String不是Primitive类型.

任何人都可以指导我吗?

Fed*_*rne 44

两篇文章都说字符串不是原始类型.它不是.

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

string不是原始类型.

我认为对此的困惑是,创建新字符串的语法类似于创建值类型.

定义值类型时,所有这些都是相同的(无论如何,在32位系统上)

System.Int32 a = new System.Int32(5);
System.Int32 a = 5;
int a = 5;
Run Code Online (Sandbox Code Playgroud)

就像创建引用类型字符串时一样:

System.String s = new System.String(new char[]{'h', 'e', 'l', 'l', 'o'});
System.String s = "hello";
string s = "hello";
Run Code Online (Sandbox Code Playgroud)

我们也可以按值比较字符串,即使它们是引用类型:

s == "hello";//true
Run Code Online (Sandbox Code Playgroud)

这仍然不会使字符串成为原始类型.

这个问题的公认答案应该为您提供详细信息.

  • 如果你看到第一篇文章,它说Visual Basic .NET定义了以下基本类型:列出:String引用类型,它表示一系列Unicode字符并映射到System.String.String类型的默认值是空引用. (4认同)
  • @Ram - 他们**正好**相同的类型,所以没有实际的区别.如果VB想要**调用**字符串原语,那就好了.但这并不能使它成为.NET原语. (4认同)

Jea*_*nal 44

原始类型没有"微软"的定义.

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

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

你会发现所有这些事情之间只有部分重叠; 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是它自己非常特别的雪花;

  • @Matt:`IsPrimitive` 函数具有相同的行为,无论它是从什么 .NET 语言调用的,而且它是 CLR 定义。 (2认同)

Gis*_*shu 10

更改立场更新:否,因为代码不存在

Console.WriteLine(typeof(string).IsPrimitive); => False
Console.WriteLine(typeof(int).IsPrimitive); => True
Run Code Online (Sandbox Code Playgroud)

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

C#中的所有原始数据类型都是System命名空间中的对象.对于每种数据类型,都提供了短名称或别名.

来源:http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx 另一篇赞成的文章 - MSDN Mag文章

总结:我猜答案取决于你对原语定义,这个定义并没有明确定义.来源:Eric Lippert在另一个SO线程上.


Mar*_*ell 6

.NET定义(来自您的文章):

基元类型是布尔,字节,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Char,Double和Single.

所以不行.内置且非常重要:是的,但不是原始的.

VB对CLI和C#的定义略有不同.