(C#) Förklaring när man lagrar en string tex.

Trädvy Permalänk
Medlem
Registrerad
Maj 2012

(C#) Förklaring när man lagrar en string tex.

Jag sitter och läser en bok om C Sharp (grund), och jag har då skrivit ett liknande exempel
som beskrivs i boken. Det jag inte riktigt förstår, kollar man nedan så sparar jag svaret från
användaren i en string jag kallar "indata". Denna string används i två stycken tillfälle där man
väntar svar från användaren. Koden fungerar fläckfritt (ignorera varför tex if satsen används
och inte switch eller om användaren råkar trycka en bokstav istället för en siffra osv)
,
men hur kommer det sig att man kan spara olika data vid olika tillfällen?
Om jag tex anger första string för "indata1" istället och den andre "indata2" skiljer man på de olika
informationen, och verkar mer som att det skulle vara "rätt". Båda exemplen fungerar ju tydligen lika bra, men
förstår bara inte varför exemplet nedan egentligen fungerar?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string indata; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("När man hyr vår stuga i Småland, får du 10% rabatt för 2 veckor, 20% för 3 veckor samt 30% för 4 veckor eller mer!"); Console.ForegroundColor = ConsoleColor.Gray; Console.Write("Hur många veckor vill du boka stugan? "); indata = Console.ReadLine(); int antalVeckor = int.Parse(indata); Console.Write("Hur mycket kostar stugan att hyra per vecka? "); indata = Console.ReadLine(); double prisPerDag = double.Parse(indata); double summa = antalVeckor * prisPerDag; if (antalVeckor >= 4) { summa = summa * 0.70; Console.Beep(); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Vill du boka stugan i " + antalVeckor + " vecka för " + summa + "kr? (Du erhåller 30% i rabatt!)"); } else if (antalVeckor == 3) { summa = summa * 0.80; Console.Beep(); Console.WriteLine("Vill du boka stugan i " + antalVeckor + " veckor för " + summa + "kr? (Du erhåller 20% i rabatt!)"); } else if (antalVeckor == 2) { summa = summa * 0.90; Console.Beep(); Console.WriteLine("Vill du boka stugan i " + antalVeckor + " veckor för " + summa + "kr? (Du erhåller 10& i rabatt!)"); } else if (antalVeckor == 1) { Console.Beep(); Console.WriteLine("Vill du boka stugan i " + antalVeckor + " veckor för " + summa + "kr? (Du erhåller ingen rabatt...)"); } } } }

/Behöver support!

CPU: i7 5820k [4.3GHz] | Kylning: Corsair H100iGTX | MB: Asus x99-A| RAM: Corsair 16GB RAM (2666MHz) | GPU: Gigabyte GTX 980Ti | SSD: Samsung Pro 840 -256GB, Intel 520 -120GB | HD: 2x2TB Western Digital | CHASSI: Antec P280 | LJUDKORT: Asus Xonar DG | SKÄRM: Samsung 27" IPS (2560x1440) SA850T | Nätverkskort TP-Link TL-WDN4800

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Dec 2003

@digitalflaskpost
indata = Console.ReadLine();
du läser in till indata

int antalVeckor = int.Parse(indata);
du spara indata som en int i antalVeckor

så indata används bara temporärt, så kan den användas igen nästa gång du behöver något

i7-6700k@4.5Ghz,Asus Z170 Pro Gaming, Asus Strix GTX970,HyperX Fury 2133MHz 32GB (4x8GB), 250GB+500GB SSD Samsung 840, Win 10 H 64bit,Noctua NH-D15S,Fractal Design R4, Behringer UMC404

Trädvy Permalänk
Medlem
Plats
Kista
Registrerad
Aug 2004

Efter att du har läst in data från användaren till variabeln "indata" så sparar du värdet i variabeln som heter "antalVeckor". Detta sker på raden där det står följande:
int antalVeckor = int.Parse(indata);

Vad du gör med variabeln "indata" efter ovanstående rad spelar ingen roll. Variabeln "antalVeckor" kommer att behålla sitt värde tills du väljer att tilldela den ett annat värde, den är inte knuten till "indata" på något sätt. Därför går det bra att återanvända samma variabel flera gånger så länge som du sparar undan värdet i andra variabler.

Trädvy Permalänk
Medlem
Registrerad
Sep 2010

Vad heter boken och var köpte du den? Är själv lite intresserad av att hobbyprogramera i C#

In Win D-frame mini | 4690K | GTX 980 Strix | Asus Z97i-Plus | 2x8GB Corsair Dominator

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av RogerL:

@digitalflaskpost
indata = Console.ReadLine();
du läser in till indata

int antalVeckor = int.Parse(indata);
du spara indata som en int i antalVeckor

så indata används bara temporärt, så kan den användas igen nästa gång du behöver något

Jo, jag förstår helt o hållet hur "indata" används för att spara information från användarens "svar"...
Jag skapade en variabel i minnet på datorn först i en typ "null", sedan när användaren skriver input, så "fylller" han den med information...
Vad jag inte förstår är hur jag kan använda samma variabel namn till att spara två olika input...
Hade jag "tänkt" själv i detta fall hade jag skapat två olika variabler med olika namn. När jag kikar på syntaxen, ser det ju ut som att andra gången användaren "fyller" variabeln, skriver han över den första som är sparat i minnet... förstår du hur jag tänker ?

Skrivet av Skyflyer:

Efter att du har läst in data från användaren till variabeln "indata" så sparar du värdet i variabeln som heter "antalVeckor". Detta sker på raden där det står följande:
int antalVeckor = int.Parse(indata);

Vad du gör med variabeln "indata" efter ovanstående rad spelar ingen roll. Variabeln "antalVeckor" kommer att behålla sitt värde tills du väljer att tilldela den ett annat värde, den är inte knuten till "indata" på något sätt. Därför går det bra att återanvända samma variabel flera gånger så länge som du sparar undan värdet i andra variabler.

Så jag kan alltså använda samma variabel åter igen, bara jag först tilldelar den innan jag använder den igen? Som i detta fall hann jag tilldela den till "antalVeckor", då är jag alltså "säker" och kan använda den igen till (i detta fall) prisPerDag... ?
Betyder det att i bakgrunden raderades första information ut från "indata" när jag sedan tilldelade "indata" inputen till prisPerDag?
Hoppas ni förstår mina krångliga tankar, för mitt huvud är lite snurrigt just nu =/

Skrivet av fromis:

Vad heter boken och var köpte du den? Är själv lite intresserad av att hobbyprogramera i C#

Boken heter "Skarp programmering med C#" av jan Skansholm.

CPU: i7 5820k [4.3GHz] | Kylning: Corsair H100iGTX | MB: Asus x99-A| RAM: Corsair 16GB RAM (2666MHz) | GPU: Gigabyte GTX 980Ti | SSD: Samsung Pro 840 -256GB, Intel 520 -120GB | HD: 2x2TB Western Digital | CHASSI: Antec P280 | LJUDKORT: Asus Xonar DG | SKÄRM: Samsung 27" IPS (2560x1440) SA850T | Nätverkskort TP-Link TL-WDN4800

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Aug 2011

Jag kan rekommendera följande sida för nybörjare som vill lära sig lite: http://www.csharpskolan.se/showcats.php Enkelt att följa med med bilder och exempelkod

Skrivet av fromis:

Vad heter boken och var köpte du den? Är själv lite intresserad av att hobbyprogramera i C#

Skrivet av digitalflaskpost:

text
Boken heter "Skarp programmering med C#" av jan Skansholm.

CPU:Intel core i7 3770K @ 4.7 ghz, +0.125 offset spänning (Hyper 212 push-pull) GPU: ASUS GTX 1080 TI STRIX OC @ 2078 / 12000mhz MINNE:16gb Corsair Vengeance 1600mhz @ 8-9-8-24, 1.5v MODERKORT:Asus P8z77-V PRO NÄTAGG:Antec High Current Gamer 900w SSD: Samsung SM843 480gb, Samsung 830 256gb, Samsung 840 PRO 256gb CHASSI: Fractal Design Define R5 Titanium @ 6 fans LJUDKORT: ASUS Xonar Essence STX HÖRLURAR: QPAD QH-90 OS: Windows 10 PRO

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av RasmusC:

Jag kan rekommendera följande sida för nybörjare som vill lära sig lite: http://www.csharpskolan.se/showcats.php Enkelt att följa med med bilder och exempelkod

Tack för inputen.. Är ibland inne där oxå. Dock så lär jag mig lättare från litteratur & video tutorials. Har lite svårt för rena fakta texter.

CPU: i7 5820k [4.3GHz] | Kylning: Corsair H100iGTX | MB: Asus x99-A| RAM: Corsair 16GB RAM (2666MHz) | GPU: Gigabyte GTX 980Ti | SSD: Samsung Pro 840 -256GB, Intel 520 -120GB | HD: 2x2TB Western Digital | CHASSI: Antec P280 | LJUDKORT: Asus Xonar DG | SKÄRM: Samsung 27" IPS (2560x1440) SA850T | Nätverkskort TP-Link TL-WDN4800

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Aug 2011
Skrivet av digitalflaskpost:

Tack för inputen.. Är ibland inne där oxå. Dock så lär jag mig lättare från litteratur & video tutorials. Har lite svårt för rena fakta texter.

Jag förstår, har många kamrater som var likadana. Om du har vill så har jag ett stort bibliotek av gamla projekt från när jag kodade C# här: http://www.sweclockers.com/forum/trad/1317803-c-programmering...

Jag är nästintill helt självlärd så några kommentarer finns ofta inte med dessvärre, men du kanske har någon användning av dem

CPU:Intel core i7 3770K @ 4.7 ghz, +0.125 offset spänning (Hyper 212 push-pull) GPU: ASUS GTX 1080 TI STRIX OC @ 2078 / 12000mhz MINNE:16gb Corsair Vengeance 1600mhz @ 8-9-8-24, 1.5v MODERKORT:Asus P8z77-V PRO NÄTAGG:Antec High Current Gamer 900w SSD: Samsung SM843 480gb, Samsung 830 256gb, Samsung 840 PRO 256gb CHASSI: Fractal Design Define R5 Titanium @ 6 fans LJUDKORT: ASUS Xonar Essence STX HÖRLURAR: QPAD QH-90 OS: Windows 10 PRO

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av digitalflaskpost:

När jag kikar på syntaxen, ser det ju ut som att andra gången användaren "fyller" variabeln, skriver han över den första som är sparat i minnet...

Det är hela poängen med en variabel, att man kan tilldela den ett nytt värde. Annars är det en konstant, som i C# deklareras med prefixet const:

string str1 = "en variabel, kan tilldelas ett nytt värde"; const string str2 = "en konstant, kan inte tilldelas ett nytt värde";

Du kan tänka på en variabel som en pekare till en minnesaddress. Om du t.ex. har "int i = 10" så pekar i på en minnescell med innehållet 10. Om du sen säger "i = 20" så ersätts värdet i den minnescellen med 20. Strängar är lite mer komplicerade, men de fungerar på samma sätt:

// Skapa ny sträng "string one" och låt s peka på den. string s = "string one"; // Skapa en annan sträng "string two" och ändra s till att peka på den istället. // Eftersom ingen nu använder "string one" så kommer det minnet att frigöras av C#:s skräphanterare. s = "string two"; // Skapa en ny variabel s2, och låt den peka på det som s pekar på, dvs. "string two". string s2 = s; // Ändra s till att peka på en ny sträng "string three". s2 kommer fortfarande att peka på "string two", // som därmed inte kommer att tas bort av skräphanteraren eftersom den fortfarande används. s = "string three";

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av RasmusC:

Jag förstår, har många kamrater som var likadana. Om du har vill så har jag ett stort bibliotek av gamla projekt från när jag kodade C# här: http://www.sweclockers.com/forum/trad/1317803-c-programmering...

Jag är nästintill helt självlärd så några kommentarer finns ofta inte med dessvärre, men du kanske har någon användning av dem

Oj, tack så mycket. Ska dyka in i materialet lite senare.
Kanske kan jag bolla med någon fråga med materialskaparen, ifall något oklart skulle uppstå?

/Kim

CPU: i7 5820k [4.3GHz] | Kylning: Corsair H100iGTX | MB: Asus x99-A| RAM: Corsair 16GB RAM (2666MHz) | GPU: Gigabyte GTX 980Ti | SSD: Samsung Pro 840 -256GB, Intel 520 -120GB | HD: 2x2TB Western Digital | CHASSI: Antec P280 | LJUDKORT: Asus Xonar DG | SKÄRM: Samsung 27" IPS (2560x1440) SA850T | Nätverkskort TP-Link TL-WDN4800

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av perost:

Det är hela poängen med en variabel, att man kan tilldela den ett nytt värde. Annars är det en konstant, som i C# deklareras med prefixet const:

string str1 = "en variabel, kan tilldelas ett nytt värde"; const string str2 = "en konstant, kan inte tilldelas ett nytt värde";

Du kan tänka på en variabel som en pekare till en minnesaddress. Om du t.ex. har "int i = 10" så pekar i på en minnescell med innehållet 10. Om du sen säger "i = 20" så ersätts värdet i den minnescellen med 20. Strängar är lite mer komplicerade, men de fungerar på samma sätt:

// Skapa ny sträng "string one" och låt s peka på den. string s = "string one"; // Skapa en annan sträng "string two" och ändra s till att peka på den istället. // Eftersom ingen nu använder "string one" så kommer det minnet att frigöras av C#:s skräphanterare. s = "string two"; // Skapa en ny variabel s2, och låt den peka på det som s pekar på, dvs. "string two". string s2 = s; // Ändra s till att peka på en ny sträng "string three". s2 kommer fortfarande att peka på "string two", // som därmed inte kommer att tas bort av skräphanteraren eftersom den fortfarande används. s = "string three";

Super tack! Det var precis en sån typ av förklaring som behövdes för att jag ska förstå.

Förresten, av vilken anledning skulle man vilja skapa en "const string" istället för en vanlig "string"?
Har det nån fördel?

Lade till en fråga...

CPU: i7 5820k [4.3GHz] | Kylning: Corsair H100iGTX | MB: Asus x99-A| RAM: Corsair 16GB RAM (2666MHz) | GPU: Gigabyte GTX 980Ti | SSD: Samsung Pro 840 -256GB, Intel 520 -120GB | HD: 2x2TB Western Digital | CHASSI: Antec P280 | LJUDKORT: Asus Xonar DG | SKÄRM: Samsung 27" IPS (2560x1440) SA850T | Nätverkskort TP-Link TL-WDN4800

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av digitalflaskpost:

Jag sitter och läser en bok om C Sharp (grund), och jag har då skrivit ett liknande exempel
som beskrivs i boken. Det jag inte riktigt förstår, kollar man nedan så sparar jag svaret från
användaren i en string jag kallar "indata". Denna string används i två stycken tillfälle där man
väntar svar från användaren. Koden fungerar fläckfritt (ignorera varför tex if satsen används
och inte switch eller om användaren råkar trycka en bokstav istället för en siffra osv)
,
men hur kommer det sig att man kan spara olika data vid olika tillfällen?
Om jag tex anger första string för "indata1" istället och den andre "indata2" skiljer man på de olika
informationen, och verkar mer som att det skulle vara "rätt". Båda exemplen fungerar ju tydligen lika bra, men
förstår bara inte varför exemplet nedan egentligen fungerar?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string indata; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("När man hyr vår stuga i Småland, får du 10% rabatt för 2 veckor, 20% för 3 veckor samt 30% för 4 veckor eller mer!"); Console.ForegroundColor = ConsoleColor.Gray; Console.Write("Hur många veckor vill du boka stugan? "); indata = Console.ReadLine(); int antalVeckor = int.Parse(indata); Console.Write("Hur mycket kostar stugan att hyra per vecka? "); indata = Console.ReadLine(); double prisPerDag = double.Parse(indata); double summa = antalVeckor * prisPerDag; if (antalVeckor >= 4) { summa = summa * 0.70; Console.Beep(); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine("Vill du boka stugan i " + antalVeckor + " vecka för " + summa + "kr? (Du erhåller 30% i rabatt!)"); } else if (antalVeckor == 3) { summa = summa * 0.80; Console.Beep(); Console.WriteLine("Vill du boka stugan i " + antalVeckor + " veckor för " + summa + "kr? (Du erhåller 20% i rabatt!)"); } else if (antalVeckor == 2) { summa = summa * 0.90; Console.Beep(); Console.WriteLine("Vill du boka stugan i " + antalVeckor + " veckor för " + summa + "kr? (Du erhåller 10& i rabatt!)"); } else if (antalVeckor == 1) { Console.Beep(); Console.WriteLine("Vill du boka stugan i " + antalVeckor + " veckor för " + summa + "kr? (Du erhåller ingen rabatt...)"); } } } }

/Behöver support!

Intressant att du frågar!

Till skillnad från @perost ovan så anser inte jag att hela poängen med variabler är att de kan byta värde. Det är fortfarande stor skillnad på ett värde som är känt sedan innan — en konstant — och ett värde som på något sätt räknas fram men som efter detta aldrig ändras.

I Java kan man deklarera en variabel final, vilket innebär att värdet måste tilldelas på samma plats och sedan aldrig kan ändras. I C# kan du använda readonly på klassfält, men tyvärr inte inuti metoder. Det finns andra språk som uppmuntrar att man aldrig ändrar värde på en tilldelad variabel, och språk som rakt av inte tillåter det. Det är mycket vanligare att funktionella språk fungerar på detta vis, se exempelvis Haskell.

Jag skulle gå så långt som att säga att det för generell programmering är en best practice att inte återanvända variabelnamn vid flera tilldelningar, men som med så mycket annat finns det undantagsfall.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av Teknocide:

Intressant att du frågar!

Till skillnad från @perost ovan så anser inte jag att hela poängen med variabler är att de kan byta värde. Det är fortfarande stor skillnad på ett värde som är känt sedan innan — en konstant — och ett värde som på något sätt räknas fram men som efter detta aldrig ändras.

I Java kan man deklarera en variabel final, vilket innebär att värdet måste tilldelas på samma plats och sedan aldrig kan ändras. I C# kan du använda readonly på klassfält, men tyvärr inte inuti metoder. Det finns andra språk som uppmuntrar att man aldrig ändrar värde på en tilldelad variabel, och språk som rakt av inte tillåter det. Det är mycket vanligare att funktionella språk fungerar på detta vis, se exempelvis Haskell.

Jag skulle gå så långt som att säga att det för generell programmering är en best practice att inte återanvända variabelnamn vid flera tilldelningar, men som med så mycket annat finns det undantagsfall.

Ok, magkänslan säger mig att efter jag tilldelat ett variabelnamn, lämnar jag det ifred och "återanvänder" det ej...
Förklaring för mitt tänkande, är nog det att jag inte ska "röra ihop" det i mig eget huvud...

En nackdel skulle kanske vara om man skulle skapade en massa nya variabelnamn, är att programmet reserverar onödigt många/mycket utrymmer i minnet, istället för att bara "sudda ut och ersätta"?

Jag vet inte, det kanske inte är så här som det hela fungerar, jag är ganska "fresh" i ämnet så jag filosoferar mest

CPU: i7 5820k [4.3GHz] | Kylning: Corsair H100iGTX | MB: Asus x99-A| RAM: Corsair 16GB RAM (2666MHz) | GPU: Gigabyte GTX 980Ti | SSD: Samsung Pro 840 -256GB, Intel 520 -120GB | HD: 2x2TB Western Digital | CHASSI: Antec P280 | LJUDKORT: Asus Xonar DG | SKÄRM: Samsung 27" IPS (2560x1440) SA850T | Nätverkskort TP-Link TL-WDN4800

Trädvy Permalänk
Medlem
Plats
Digital medborgare
Registrerad
Aug 2004
Skrivet av digitalflaskpost:

Super tack! Det var precis en sån typ av förklaring som behövdes för att jag ska förstå.

Förresten, av vilken anledning skulle man vilja skapa en "const string" istället för en vanlig "string"?
Har det nån fördel?

Jag vet inte ifall man sparar någon datorkraft för att den inte behöver göra checks på den för att validera något. Det finns en del boundchecking och liknande på arrayer i C#, för att man inte skall kunna göra buffer overflows som man kan i andra språk. Anledningen till att man vill använda konstanter är ju för värden som man vet inte förändras och absolut inte får förändras.

Exempel 1: Math.PI representerar pi, det är ett konstant värde (public const double PI = 3.14159;). Det hade inte varit så bra om man hade kunnat förändra eftersom de flesta använder just den referensen i stället för att behöva definera det själv. Ett centralt ställe som garanterar att alla beräkningar som använder den konstanten fungerar på samma sätt / ger samma resultat.

Exempel 2: Du skriver ett program som kopplar upp sig mot ett annat affärssystem. Kanske ett bokningssystem. Du vet att kategorierna i det systemet för bokning har fasta ID. Stuga har t.ex categoryId = 54867, Höghus = categoryId = 268. Då skapar du en klass som heter BuildingCategory med konstanter för varje typ av byggnadskategori som finns i affärssystemet. Det gör det lättare för du behöver inte komma ihåg en massa siffror, utan du vet att när du vill ha ID för stuga så skriver du bara BuildingCategory.StugaId i stället för 54867.

Ang variabel: "Variable" comes from a Latin word, variābilis, with "vari(us)"' meaning "various" and "-ābilis"' meaning "-able", meaning "capable of changing".

GL HF

gfårs 1070. 3570K. 16 Gigabong RAM. Server, NAS, pi, steamlink, casts, nätverkssladdar, sega master system, massor av faptops, mus med 17 knappar, öronproppar, strumpor av ren bomull med elastiskt band för att hålla dem uppe. 2 barn, 1 fru, 99 problem.

Trädvy Permalänk
Medlem
Plats
Digital medborgare
Registrerad
Aug 2004
Skrivet av digitalflaskpost:

En nackdel skulle kanske vara om man skulle skapade en massa nya variabelnamn, är att programmet reserverar onödigt många/mycket utrymmer i minnet, istället för att bara "sudda ut och ersätta"?

Japp, det kan vara en stor nackdel. Ofta så fokuserar man på tydlighet (på jobbet i sin kod ifall någon annan kanske skall ta över eller om man kommer att göra att återbesök i den om kanske ett år. Det är fantastiskt vad mycket man kan glömma på ett år och hur pass ens kodstil förändras när man lär sig nya tekniker och teknologier. Därför kan det vara bra att använda en variabel för varje sak.

Är du däremot spelutvecklare, så får du lära dig att snåla med minnet och beräkningar. Inte skapa så mycket data och kasta det eftersom garbage collectorn tittar fram i tid och otid och kan ge dig stuttering och liknande ifall du inte håller koll på din instansiering. Där återanvänder man ofta objekt genom att lägga dem i en cache och kanske "reseta" dem innan användning. Där handlar det ofta om tusentals-miljontals objekt.

(Garbage collectorn är något som ligger i bakgrunden och letar efter objekt som du inte använder längre / som det inte finns någon referens till för att den förstöra dem och avallokera minne.)

gfårs 1070. 3570K. 16 Gigabong RAM. Server, NAS, pi, steamlink, casts, nätverkssladdar, sega master system, massor av faptops, mus med 17 knappar, öronproppar, strumpor av ren bomull med elastiskt band för att hålla dem uppe. 2 barn, 1 fru, 99 problem.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av digitalflaskpost:

Förresten, av vilken anledning skulle man vilja skapa en "const string" istället för en vanlig "string"?
Har det nån fördel?

Man brukar använda konstanter t.ex. för att ge namn på värden, för att undvika s.k. "magic numbers". T.ex.:

int i = 28.63 * x;

Här är 28.63 ett nummer som bara dyker upp utan någon förklaring. Jämför med:

const int AVERAGE_FISH_LENGTH = 28.63; int i = AVERAGE_FISH_LENGTH * x;

Med en konstant så kan ett värde användas på flera ställen med ett beskrivande namn, och om man behöver ändra på konstanten så behöver man bara göra det på ett ställe. Att den är konstant gör också att man kan vara säker på att den inte ändras under exekvering, och tillåter också kompilatorn att optimera koden bättre.

Sen var det kanske inte helt korrekt av mig att säga att hela poängen med variabler är att de kan ändra värde. I själva verket så är definitionen på en variabel att den kan tilldelas ett värde under exekvering, till skillnad mot en konstant som tilldelas ett värde vid kompilering. Sen beror det på språket om man får ändra en variabels värde eller inte.

Trädvy Permalänk
Medlem
Registrerad
Maj 2012
Skrivet av kelthar:

Jag vet inte ifall man sparar någon datorkraft för att den inte behöver göra checks på den för att validera något. Det finns en del boundchecking och liknande på arrayer i C#, för att man inte skall kunna göra buffer overflows som man kan i andra språk. Anledningen till att man vill använda konstanter är ju för värden som man vet inte förändras och absolut inte får förändras.

Exempel 1: Math.PI representerar pi, det är ett konstant värde (public const double PI = 3.14159;). Det hade inte varit så bra om man hade kunnat förändra eftersom de flesta använder just den referensen i stället för att behöva definera det själv. Ett centralt ställe som garanterar att alla beräkningar som använder den konstanten fungerar på samma sätt / ger samma resultat.

Exempel 2: Du skriver ett program som kopplar upp sig mot ett annat affärssystem. Kanske ett bokningssystem. Du vet att kategorierna i det systemet för bokning har fasta ID. Stuga har t.ex categoryId = 54867, Höghus = categoryId = 268. Då skapar du en klass som heter BuildingCategory med konstanter för varje typ av byggnadskategori som finns i affärssystemet. Det gör det lättare för du behöver inte komma ihåg en massa siffror, utan du vet att när du vill ha ID för stuga så skriver du bara BuildingCategory.StugaId i stället för 54867.

Ang variabel: "Variable" comes from a Latin word, variābilis, with "vari(us)"' meaning "various" and "-ābilis"' meaning "-able", meaning "capable of changing".

GL HF

Tack för tydliga förklaringar. Det var väldigt specifika, vilket gjorde att jag verkligen förstod syftet (programmering är väldigt svårt vid själva inlärningen).

Skrivet av perost:

Man brukar använda konstanter t.ex. för att ge namn på värden, för att undvika s.k. "magic numbers". T.ex.:

int i = 28.63 * x;

Här är 28.63 ett nummer som bara dyker upp utan någon förklaring. Jämför med:

const int AVERAGE_FISH_LENGTH = 28.63; int i = AVERAGE_FISH_LENGTH * x;

Med en konstant så kan ett värde användas på flera ställen med ett beskrivande namn, och om man behöver ändra på konstanten så behöver man bara göra det på ett ställe. Att den är konstant gör också att man kan vara säker på att den inte ändras under exekvering, och tillåter också kompilatorn att optimera koden bättre.

Sen var det kanske inte helt korrekt av mig att säga att hela poängen med variabler är att de kan ändra värde. I själva verket så är definitionen på en variabel att den kan tilldelas ett värde under exekvering, till skillnad mot en konstant som tilldelas ett värde vid kompilering. Sen beror det på språket om man får ändra en variabels värde eller inte.

Super, tack!

CPU: i7 5820k [4.3GHz] | Kylning: Corsair H100iGTX | MB: Asus x99-A| RAM: Corsair 16GB RAM (2666MHz) | GPU: Gigabyte GTX 980Ti | SSD: Samsung Pro 840 -256GB, Intel 520 -120GB | HD: 2x2TB Western Digital | CHASSI: Antec P280 | LJUDKORT: Asus Xonar DG | SKÄRM: Samsung 27" IPS (2560x1440) SA850T | Nätverkskort TP-Link TL-WDN4800