Is String a primitive type?

后端 未结 10 1193
难免孤独
难免孤独 2020-11-27 18:36

I am curious about the string and primitive types. Article like this says string is primitive type. However second article on MSDN does not list string as primitive type.

10条回答
  •  一整个雨季
    2020-11-27 18:38

    There is no "Microsoft" definition of what a primitive type is.

    There are only definitions of primitive types in a given context.

    • The CLR defines primitive types as being nothing more than:
      • 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
    • The VB.NET specification version 10 (in section 7.3) defines "primitive types" as being types that have a keyword alias for the type (thus allowing the usage of that type without importing the System namespace), a way to define instances of that type with a literal; and permitting the use of these types as constants; the primitive types in VB.NET are:
      • 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
    • The C# specification (version 4) defines keyword aliases for some types, and also defines way of specifying literals for some values; it also defines, separately, which types are available in constant expressions; the closest concept to "primitive types" that C# has is in section 4.1.4: Simple types. (the word "primitive" is only used twice in the 600 pages document); these primitive types are simply defined as "value types that have a keyword alias in C#" - string is not mentioned in that section:

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

    In conclusion: different contexts have different definitions for what a "primitive type" is. It does not matter - just learn how to use your programming language, there is no sense in fighting and thinking over such polymorphic words. Personally, I wonder why the property Type.IsPrimitive even exists.

    As for System.String:

    • CLR: Nothing special, it is just a reference type;
    • VB.NET: It is a primitive type;
    • C#: String is its own very special snowflake;

提交回复
热议问题