C# - int variable ToString()

Tags:    c# integer tostring

Hej

Jeg sidder og læser en tutorial om C#.net og er i den forbindelse stødt på noget som jeg slet ikke forstår.



Problemet drejer sig om integers og hvorfor man får en fejl hvis man forsøger at få MessageBox.Show(myInteger); til at vise en numerisk værdi - det kan man ikke uden at bruge:

MessageBox.Show(myInteger.ToString());

Prøv evt. at kigge her:

http://www.homeandlearn.co.uk/csharp/csharp_s2p5.html

sådan som jeg læser koden, så beder man jo blot messageboxen om at vise hvad variablen indeholder og som det kan ses i eksemplet, på siden jeg henviser til, så er variablen myInteger af typen integer og værdien i den er 25.

Hvorfor skal man så (tilsyneladende)konvertere den til en String for at få den vist på skærmen ? - kan en messagebox ikke vise en numerisk værdi ?

Håber nogen kan give en god forklaring :o)






8 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
C# er et typestærkt sprog og det giver et væld af fordele fordi det tvinger dig til at tage stilling til hvad du vil.

Hvis du ser på integer så har du en række muligheder for at gøre alt muligt smart fordi det er en integer.
Du kan spørge om i < 4, eller sige i++ for at tælle den op etc.

Så snart du ændrer dette til en string (med .ToString()) så ændrer du typen til en string og dine muligheder fra integer forsvinder.
Du får så pludseligt en række andre muligheder ved at kunne søge i teksten, se om den indeholder et komma eller punktum, længden på teksten etc.

Når du laver .ToString() så ændrer du typen fra integer som er tal, til ren flad tekst. Det giver dig også en masse fordele fordi du kan formatere som du ønsker, sætte kultur og en masse andet.
Du kan i din .ToString() indsætte parametre om er dette valuta, kommatal, eller andet så du kan få det præsenteret lige som du vil.
Ved at tvinge dig til at du skal lave det til en string tvinges du også til at tænke over formattet og præsentationsformen - for hvordan skal din messagebox vide at din integer er faktisk hvor mange us dollars noget koster og skal skrive 1000.00 i stedet for den danske udgave 1.000,00 (du ville her skulle fortælle at der skal decimal på-fordi integer jo selvfølgelig er heltal)?

Du skal i denne kontekst tænke på at en MessageBox er til Messages (beskeder), så her er det nærliggende at du kun kan indsætte tekst.
Ved at lave din integer om til tekst er det som at tage et øjebliksbillede og fjerne referencen til din integer - så selv hvis du ændrer din integer i et loop lige efter du har vist din messagebox så er det helt afskåret fra at skulle ændre ved din præsentation fordi det er tekst.

Håber det gav lidt ide til hvorfor tingene er som de er og hvorfor det er vigtigt at have denne "feature" i C# og forstå hele det typestærke element :)



Indlæg senest redigeret d. 31.10.2012 10:58 af Bruger #17215
Du er stødt ind i det simpleste tilfælde af forskellen mellem en variabels værdi, og hvordan man præsenterer variablens værdi. I dit tilfælde virker det simpelt, men det behøver det ikke at være. Jeg lavede engang et lille program der skulle bruges til at gennemgå kontrolmålinger. Her var det afgørende at der ikke blev blandet rundt i negative og positive værdier, så alle positive heltal skulle skrives "+25". Dvs. selvom jeg havde præcis den samme variabel som i dit tilfælde, skulle den præsenteres anderledes.

Forskellen mellem en variabel og dens præsentation bliver større når du begynder at arbejde med f.eks. decimaltal. Hvis du f.eks. har en variable

float myVariable = 1002.1225;

kan det være at du gerne vil vise den på skærmen som "1002,1225" eller "1002,12" eller "1.002,12" eller "1.0e3" osv. Det er altså en central ting at adskille den værdi en variabel har, fra den måde du præsenterer variablen i diverse sammenhænge (i et interface, i en pdf, i en csv-fil osv.)

Tilbage til dit eksempel. Jeg kan stadig godt forstå at du synes det virker besværligt at man eksplicit skal angive en konvertering, og det kunne sikkert godt være lavet sådan, så det ikke var nødvendigt. Men jeg tror egentlig at det er en meget god ting, at man bliver tvunget til at tage stilling til hvordan man ønsker at præsentere en variabel, for ofte er det ikke så simpelt, som det umiddelbart virker.



Nu er c# type stærkt og MessageBox.Show tager kun et argument - en string. Du kan ikke 'overskrive' .Show metoden til at tage andre argumenter da den er static, så enten nedarver du fra den og ændre det eller bruger .ToString :)



Alt det med at C# er typestærkt, minder mig og et blog-indlæg jeg læste for nyligt:

http://blogs.msdn.com/b/ericlippert/archive/2012/10/15/is-c-a-strongly-typed-or-a-weakly-typed-language.aspx

Bare hvis i har lyst til at læse.



Hej igen

Tak for jeres svar.

Jeg er glad for måden I svare mig på dvs. at I li'som forudsætter, at spørgeren ikke ved noget som helst (hvilket I har helt og aldeles ret i !) og undlader, at bruge alt for mange tekniske udtryk. Jeg synes også det er et kæmpe plus, at I også kommer med eksempler, da det hjælper på forståelsen.

Så endnu engang mange tak for hjælpen.




@Henrik
Vi er jo bare glade for det hjalp på forståelsen og det vi er herinde for.

@Brian
Henvises der til at man kan opbevare nogle datatyper i hinanden? Altså fx at du har en double og sætter den lig med en int og det så fungerer?
Eller er det mere at der nu er kommet var? For mig bekendt så sker valideringen ikke først run-time?



Hej Henrik,

Godt du kunne bruge svarene. Husk at stemme på det/de indlæg der bedst hjalp dig med dit problem, så andre også kan få glæde af det :)

Mvh.

Kasper (TSW)



Kan ikke give dig nogen videre forklaring anden en den der står i teksten, desværre, men er da interesseret i at se om andre kan det. Selv har jeg altid bare brugt ToString() uden at tænke over det, så jeg hopper lige med på en kigger hér :)



t