đ Variablers benĂ€mningar i C#
NÀr vi pratar om variabler i C-Sharp menar vi egentligen flera olika saker. En variabel kan leva i olika delar av koden och bete sig pÄ olika sÀtt beroende pÄ om den Àr lokal, ett fÀlt i en klass, en konstant eller en property.
Och som om det inte vore nog: Microsoft vill att du namnger dem olika beroende pÄ var de finns.
đ Ăversiktstabell
| Kategori | Livstid / Egenskap | Namnstil | Exempel |
|---|---|---|---|
| Lokal variabel | Finns bara inuti en metod/block (inom mÄsvingarna) | camelCase | int orderCount = 5; |
| Parameter | Lever bara i metodens scope | camelCase | void PlaceOrder(int orderId) |
| FÀlt (privat) | Hör till en klass, ofta data som properties bygger pÄ | camelCase (ibland _prefix) | private string customerName; private int _orderCount; |
| Property | Publikt grÀnssnitt mot fÀlt | PascalCase | public string CustomerName { get; set; } |
| Klassvariabel (static) | Delas av alla instanser | PascalCase | public static int ActiveUsers { get; set; } |
| Konstant (const) | Kompileras in, Àndras aldrig | PascalCase (Microsoft) UPPER_CASE (historiskt) | public const int MaxUsers = 100; |
| Readonly | Tilldelas i konstruktor, sen fryst | PascalCase | public static readonly double Pi = 3.14159; |
| Mutant (vanligt fÀlt som kan Àndras) | Kan skrivas om nÀr som helst | camelCase (privat) / PascalCase (publikt) | private int orderTotal; public int OrderTotal { get; set; } |
đ NĂ„gra viktiga skillnader
- const â mĂ„ste tilldelas direkt, vĂ€rdet brĂ€nns in vid kompilering.
- readonly â kan sĂ€ttas i konstruktorn men aldrig Ă€ndras efter objektets skapelse.
- static â delas av alla objekt i klassen, oavsett instanser.
- property â ser ut som en variabel men Ă€r egentligen en metod (getter/setter) med PascalCase.
- fĂ€lt â ârĂ„â variabel i en klass. Privata fĂ€lt ska inte visas utĂ„t, de göms ofta bakom en property.
đ§© Exempel i kod
public class Customer
{
// Konstant (oförÀnderlig, PascalCase enligt MS)
public const int MaxOrders = 100;
// KONSTANT (historiskt, UPPER_CASE)
public const int MAX_ORDERS = 100;
// Readonly (kan sÀttas i konstruktor)
public readonly DateTime CreatedAt;
// Privat fÀlt (camelCase eller _camelCase)
private string _name;
// Publik property (PascalCase), lagrar vÀrdet i ett privat fÀlt
public string Name { get {return _name;} set {_name = value}; }
// Klassvariabel (static property, PascalCase), lagrar vÀrdet i sig sjÀlv (typ)
public static int ActiveCustomers { get; set; } // Delas av alla instanser
// Konstruktor
public Customer(string name)
{
_name = name;
CreatedAt = DateTime.Now;
}
}
Exakt đ â det Ă€r dĂ€r mĂ„nga studerande tappar trĂ„den: de lĂ€r sig const, readonly och static men missar varför vi anvĂ€nder dem. Skillnaden mellan mutable/immutable och scope Ă€r egentligen grunden till att man ens behöver alla dessa nyckelord.
đ§ Viktiga begrepp: Mutable, Immutable och Scope
đ Mutable vs Immutable
Mutable (förĂ€nderlig) â variabeln kan Ă€ndras under programmets gĂ„ng. Exempel:
int counter = 0; counter = counter + 1; // Ă€ndras, alltsĂ„ mutableImmutable (oförĂ€nderlig) â nĂ€r vĂ€rdet vĂ€l Ă€r satt gĂ„r det inte att Ă€ndra. Exempel:
const int MaxUsers = 100; // konstant â kan aldrig Ă€ndras string text = "Hej"; text.ToUpper(); // skapar en NY strĂ€ng, den gamla Ă€ndras inte
đĄ Minnesregel: Mutable = âlevande leraâ, Immutable = âstenstatyâ.
đŠ Scope (var variabeln lever och syns)
Scope handlar om livslĂ€ngd och synlighet för en variabel. Det Ă€r lite som âvem har nyckeln till rummet dĂ€r variabeln borâ.
Lokalt scope â bara tillgĂ€nglig i en metod eller ett block.
void PrintName() { string name = "Anna"; // finns bara hĂ€r Console.WriteLine(name); }Klass-scope (fĂ€lt) â tillhör objektet (instansen).
class Customer { private string name; // fĂ€lt = lever sĂ„ lĂ€nge objektet lever }Static scope (klassvariabel) â delas av alla objekt.
class Customer { public static int ActiveUsers; // samma för alla kunder }Global scope â i C-Sharp finns det inte riktigt (till skillnad frĂ„n JavaScript), men
Program.cskan ha variabler pÄ toppnivÄ i moderna versioner.
đĄ Minnesregel: Scope = âhur lĂ„ngt variabeln orkar springa innan den dörâ.
đŠ Hur hĂ€nger detta ihop med const, readonly, static?
constâ Immutable + klass-scope (delas av alla).readonlyâ Immutable efter initiering + instans-scope (eller klass-scope om static).staticâ Scope pĂ„ klassnivĂ„, men kan vara bĂ„de mutable eller immutable beroende pĂ„ nyckelord.
đ Fusklapp: const vs readonly vs static
| Nyckelord | Kan Àndras? | NÀr sÀtts vÀrdet? | GÀller för | Namnstil | Exempel |
|---|---|---|---|---|---|
const | â Aldrig | Vid kompilering | Klassen/typen (delas av alla) | PascalCase (rek.) | public const int MaxUsers = 100; |
readonly | â (efter init) | Vid körning (i konstruktor eller fĂ€ltinit) | Varje instans (eller static om markerad) | PascalCase | public readonly DateTime CreatedAt; |
static | â (om ej const/readonly) | Under programmets livstid | Klassen (delas av alla instanser) | PascalCase | public static int ActiveUsers; |
static readonly | â (efter init) | Vid körning (en gĂ„ng per klass) | Klassen (delas av alla) | PascalCase | public static readonly double Pi = 3.14159; |
đŻ Sammanfattning
- camelCase â lokala variabler, parametrar, privata fĂ€lt.
- PascalCase â publika properties, metoder, klasser, konstanter, statics.
- UPPER_CASE â historiskt för konstanter, inte rekommenderat i modern C-Sharp.
- readonly vs const â readonly Ă€r lite flexiblare (kan initieras i konstruktorn).
- property â ska alltid anvĂ€ndas istĂ€llet för publika fĂ€lt.
đŻ Kom-ihĂ„g-regler
constâ stenhugget i koden (kompilatorn ersĂ€tter vĂ€rdet).readonlyâ fryst efter konstruktion (bra för tidsstĂ€mplar, IDs).staticâ alla delar samma variabel (klassnivĂ„ istĂ€llet för objekt).static readonlyâ ofta bĂ€st för konstanter som inte Ă€r primitiva tal, t.ex.DateTime,Guid.