两篇文章都说字符串不是一个基本类型。事实上,它确实不是。
如果您编译并运行第二篇文章中的示例代码,它将打印:
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
这仍然不会使字符串成为原始类型。
对于这个问题的被接受的答案应该会给你详细说明。
没有“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
)String
并不是“只是另一种引用类型”。字符串和数组是唯一的对象,它们的大小并不由它们的类型所蕴含。此外,我相信,在加载程序集时,字符串是唯一一种类型,运行时会自动生成包含存储在该程序集中数据的实例。 - supercatIsPrimitive
函数的行为不受调用它的.NET语言影响,它是CLR定义的。 - Jean HominalDim str As String = "" Console.WriteLine(str.GetType().IsPrimitive)
输出false。但正如你所说,字符串在VB.Net文档中被提及为一种原始类型,这似乎是矛盾的。 - RBT立场变更更新:由于代码不会撒谎,所以没有。
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杂志文章
总结:我想答案取决于您的原始定义,这并没有明确定义。 来源:Eric Lippert在另一个SO线程上的评论。
System
命名空间中的所有类型都是原始类型(我可以将类型添加到我的程序集的System
命名空间中,那么它们就成为了原始类型吗?),它只是说明所有现有的原始类型都可以在System
中找到,而其他地方则找不到。 - max.NET定义(来自您的文章):
原始类型包括布尔型、字节型、有符号字节型、短整型、无符号短整型、整型、无符号整型、长整型、无符号长整型、字符型、双精度浮点型和单精度浮点型。
所以,不是原始类型,但是内置且非常重要。
似乎VB使用了略微不同的定义与CLI和C#。
DateTime
是原始类型,这在我看来还算可以接受。 - nawfalnew
关键字显式创建String
实例以获取字符串对象。+
运算符连接字符串,编译器将其转换为对String.Concat
方法的调用。字符串是一种特殊的基本类型。它不是值类型,但可以被视为基本类型,因为可以通过编写字面量(例如“hello”)来创建它,并且可以声明一个字符串类型的常量。话虽如此,IsPrimitive 的返回值为 false。
Console.WriteLine("hello".GetType().IsPrimitive) // output = False
编辑:我想撤回我的答案。它在技术上不是原始类型,但具有我上面提到的属性。
String是一个引用类型。要验证这一点,请在字符串上按F12。
它们不是,因为它们是一系列字符