📖 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

KategoriLivstid / EgenskapNamnstilExempel
Lokal variabelFinns bara inuti en metod/block (inom mÄsvingarna)camelCaseint orderCount = 5;
ParameterLever bara i metodens scopecamelCasevoid 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;
PropertyPublikt grÀnssnitt mot fÀltPascalCasepublic string CustomerName { get; set; }
Klassvariabel (static)Delas av alla instanserPascalCasepublic static int ActiveUsers { get; set; }
Konstant (const)Kompileras in, Àndras aldrigPascalCase (Microsoft)
UPPER_CASE (historiskt)
public const int MaxUsers = 100;
ReadonlyTilldelas i konstruktor, sen frystPascalCasepublic static readonly double Pi = 3.14159;
Mutant (vanligt fÀlt som kan Àndras)Kan skrivas om nÀr som helstcamelCase (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Ä mutable
    
  • Immutable (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.cs kan 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

NyckelordKan Àndras?NÀr sÀtts vÀrdet?GÀller förNamnstilExempel
const❌ AldrigVid kompileringKlassen/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)PascalCasepublic readonly DateTime CreatedAt;
static✅ (om ej const/readonly)Under programmets livstidKlassen (delas av alla instanser)PascalCasepublic static int ActiveUsers;
static readonly❌ (efter init)Vid körning (en gĂ„ng per klass)Klassen (delas av alla)PascalCasepublic 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.

Upp

Upp


Licens: Apache 2.0 | © 2023 Marcus Medina, Campus Mölndal. Alla rÀttigheter förbehÄllna.
Du fÄr anvÀnda och modifiera detta verk enligt villkoren i Apache License, Version 2.0. Du fÄr inte anvÀnda detta verk för kommersiella ÀndamÄl utan tillstÄnd frÄn upphovsmannen.