c# – Is String a primitive type?

c# – Is String a primitive type?

Both articles say that string is NOT a primitive type. Which it is not.

If you compile and run the example code from the second article it would print:

string is not a primitive type.

I think the confusion about this is, that the syntax of of creating a new string is similar to creating value types.

When defining a value type all of these are equal (on a 32 bit system anyway)

System.Int32 a = new System.Int32(5);
System.Int32 a = 5;
int a = 5;

Just like these when creating a reference type string:

System.String s = new System.String(new char[]{h, e, l, l, o});
System.String s = hello;
string s = hello;

Also we can compare strings by value even though they are reference types:

s == hello;//true

This still does not make string a primitive type.

The accepted answer to this question should give you details on that.

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;

c# – Is String a primitive type?

Change-of-stance Update: No since code doesnt lie

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

—–end of update.
But some documentation online seems to treat String as a primitive. I think Yes – based on the following definition of primitive. (My personal definition would be a type which cant be broken down further into component types. But I guess were just being pedantic here, its a non-issue for me mostly.)

all primitive data types in C# are
objects in the System namespace. For
each data type, a short name, or
alias, is provided.

Source: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80%29.aspx
Another article in favor – MSDN Mag article

Summary: I guess the answer depends on your definition of primitive, which is not unambiguously defined.
Source: Eric Lippert on another SO thread.

Leave a Reply

Your email address will not be published. Required fields are marked *