Mysteriet string…

Mysteriet string…

Inom C# och de flesta andra språk så finns begreppen; värdetyp, referenstyp och primitiva variabler.  Vad är en string? Det är det som är mysteriet!

En primitiv variabeltyp är en ”variabel som direkt stöds av kompilatorn”, t.ex. int, bool, float, char och string(?)… (http://msdn.microsoft.com/en-us/magazine/bb984984.aspx)

Primitiva variabler har reserverade ord i språket som vanligtvis är ”blåa” i Visual Studio. Dessa fungerar alla som värdetyp.. men är de det..?.Litteraturen sätter ofta likhetstecken mellan primitiva variabler och värdetyp, problemet är då att de ofta inkluderar just string. Men stämmer detta? Framförallt är string en primitiv typ?

Mer info om värdetyp kontra referenstyp behövs!

Värdetyper är alla typer som bygger på struct, vilket också ”int”, ”bool” etc. gör. ”Alla värdetyper ärver från ”System.ValueType”” (http://msdn.microsoft.com/en-us/library/s1ax56ch%28v=vs.80%29.aspx) vilket får mig att misstänka att ”struct” kompileras som ”class namn : ValueType”. Kollar man om ”variabel IsValueType” via reflection, för variabler  deklarerade med ”struct” fås svaret True.

En datatyp som är av referenstyp är typiskt alla klasser, dvs datatyper definierade med ”class” men då alltså inte ärver från ”System.ValueType”.

Sidospår: är string och String samma sak? Den ena är ”blå” den andra en vanlig typ?

Det är så att ”string” bara är ett annat namn för ”System.String”. Fler exempel: http://stackoverflow.com/questions/215255/string-vs-string-in-c-sharp Liksom ”object” är ett annat namn för ”System.Object”. Dessa alias är C# specifika, däremot är t.ex. ”String” .NET specifik. Alltså det ena är språket och det andra är ramverket (implementationen).

Alltså svar: JA

Är string en primitiv?

För:
Den har ett reserverat ord (”blått”) i språket. Alltså den ”stöds direkt av kompilatorn”.
Viss litteratur säger att den är det.

Emot:
Viss litteratur säger att den INTE är det.

SVAR: string är INTE primitiv!

Är string av värde- eller referenstyp?

För värdetyp:
Den fungerar ju uppenbarligen som värdetyp när man använder den.. så svaret är väl självklart?

För referenstyp:
Kikar man på källkoden i ramverket så är string deklarerad som ”class” (ej struct).
Den kan ha värdet NULL.

SVAR: string är varken eller!?

Bevis

Kolla helt enkelt via reflektion på olika datatyper:

using System;

namespace StringMystery
{
    class Program
    {
        static void Main(string[] args)
        {
            PrintTypeInfo(typeof(int));
            PrintTypeInfo(typeof(string));
            PrintTypeInfo(typeof(Decimal));
        }

        static void PrintTypeInfo(Type t)
        {
            Console.WriteLine(t.Name);
            Console.WriteLine("Is valuetype: {0}", t.IsValueType);
            Console.WriteLine("Is reference type: {0}", t.IsByRef);
            Console.WriteLine("Is is pointer: {0}", t.IsPointer);
            Console.WriteLine("Is class: {0}", t.IsClass);
            Console.WriteLine("Is primitive: {0}", t.IsPrimitive);
            Console.WriteLine();
        }
    }
}

 

string_typeinfo

Ramverket säger oss att string varken är värde- eller referenstyp!!

Vissa kallar string för en ”predefined reference type” (http://stackoverflow.com/questions/2106132/why-do-primitive-types-in-c-sharp-have-their-own-operations). Man kan helt klart konstatera att string hanteras speciellt.

MSDN säger:
http://msdn.microsoft.com/en-us/library/ms228360%28v=vs.80%29.aspx

”C# supports two kinds of variable types:

Value types

These are the built-in primitive data types, such as char, int, and float, as well as user-defined types declared with struct.

Reference types

Classes and other complex data types that are constructed from the primitive types. Variables of such types do not contain an instance of the type, but merely a reference to an instance.”

Jag säger att det finns en tredje typ: string!

 

 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Scroll to top