Permalänk

C# const variable

Hej,

Tänkte göra const variabel i en metod i C# (medlemsvariabel). Gick inte i C#. Man förlorar utanför metoden som vilken vanlig variabel som helst..Ja.

Jag vill spara en integer i minnet mellan anropen. Kan man göra något som closure i C# (har sett i Javascript)?

Man kan ha en variabel som räknar t.ex. hur många gånger metoden anropats. Då är closure bra? Jag vill behålla värdet på heltalsvariabeln mellan anropen alltså.

Hur ser det ut i så fall (med / utan Lambda)?
Tack för svar!

Jag provade detta som fungerade.

public class MyClass
{
int nrOfCalls = 0;
public int CallMe()
{
int count(int nr)
{
return nrOfCalls += 1;
}
count(1);
Console.WriteLine("NumberOf" + nrOfCalls);
return nrOfCalls;
}
}

//Studenten

Hittade lösning.
Visa signatur

studenten

Permalänk
Medlem

Om du gör en const i metoden kommer den endast leva i metoden. Du behöver deklarera en const utanför metoden om du vill ha det.

Permalänk
Medlem

Lite osäker på vad du vill göra, varför inte spara den i en annan klass bara? Eller utanför funktionen?

Permalänk
Medlem

"const" är en konstant, den är på klassnivå. En poäng med en "const" är att den är konstant och den har endast en instans.

Ganska liten skillnad på "const" och "static readonly".

Det kanske är så att din klass är "för stor" och för komplex och att den skall brytas ner i fler klasser om du har behovet av att sätta en const i en metod.

Permalänk
Medlem

public class Foo { private readonly string _bar; private static readonly string _gazonk = "fi"; private const string _foobar = "fu" // Konstruktor public Foo(string bar) { _bar = bar; } }

Oklart exakt vad du vill göra. Om du bara vill ha en global konstant (som kan sättas från till exempel en inställningsfil en gång när programmet startar) så funkar ett static readonly-fält. Om du vill sätta ett värde när objektet skapas (och är unik per instansierat objekt) och sedan garantera att värdet aldrig ändras så kör readonly.

Läs dock manualen, för referens-värden är det bara referensen som är readonly, inte det den pekar på.

Strängar är ett specialfall, de är immutable även om de är referensvärden/en klass.

const-fält är en faktiskt inkompilerad konstant som över huvud taget inte kan ändras runtime. Den kompileras även in i andra assemblies utan att vara en referens till ursprungsassemblien, så ändrar man i ursprungsassemblien utan att kompilera om den refererande assemblien får man en konsekvens som kan vara oväntad.

Som jag, med min rätt begränsade förståelse, har fattat det hela.

Permalänk
Medlem
Skrivet av studenten:

Hej,

Tänkte göra const variabel i en metod i C# (medlemsvariabel). Gick inte i C#. Man förlorar utanför metoden som vilken vanlig variabel som helst..Ja.

Jag vill spara en integer i minnet mellan anropen. Kan man göra något som closure i C# (har sett i Javascript)?

Man kan ha en variabel som räknar t.ex. hur många gånger metoden anropats. Då är closure bra? Jag vill behålla värdet på heltalsvariabeln mellan anropen alltså.

Hur ser det ut i så fall (med / utan Lambda)?
Tack för svar!

Jag provade detta som fungerade.

public class MyClass
{
int nrOfCalls = 0;
public int CallMe()
{
int count(int nr)
{
return nrOfCalls += 1;
}
count(1);
Console.WriteLine("NumberOf" + nrOfCalls);
return nrOfCalls;
}
}

//Studenten

Vänligen använd [code][/code]-block så koden blir mer läsbar

Som de andra nämner så är det ganska oklart var du försöker uppnå. Om du vill att din variabel ska leva kvar mellan varje funktionsanrop så räcker det med att du lägger variabeln på klassnivå, t.ex som en property.

public class Thing { public int Counter { get; set; } public int Count(int amount) { return Counter += amount; } }

Att tänka på är att värdet på Counter är knutet till instansen av Thing, så om du skapar en ny instans av Thing så kommer värdet vara noll igen.

Visa signatur

| MSI B650 Tomahawk | Ryzen 7 9800X3D | ASUS RTX 3070 | 64GB DDR5 6000MHz | MSI MPG A1000G | Samsung 970 Evo M.2 1TB + 2x WD Black SN850X 2TB|