Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Nyckelordet `static` | OOP-Grunder
C# Bortom Grunderna

bookNyckelordet `static`

Ett viktigt nyckelord som du kanske redan har stött på flera gånger är static-nyckelordet. I C#-grundkursen nämndes att static används vid definition av globala variabler – variabler som ligger utanför någon specifik metod:

index.cs

index.cs

copy
1234567891011
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }

Det var ett bekvämt sätt att beskriva static-nyckelordet vid det tillfället eftersom det förväntades att läsaren kanske inte hade någon kunskap om objekt eller klasser då. Men nu, om du tittar på koden, kan du inse att val i grunden är ett fält i klassen ConsoleApp. Observera dock att klassen ConsoleApp skiljer sig något från de klasser du normalt skapar. Det beror på att ConsoleApp representerar själva programmet, och det finns inget objekt av ConsoleApp. Du kommer att återkomma till denna del om en stund.

Eftersom en klass endast är en ritning, mer som ett tomt skal, innehåller den normalt inte data i sig själv. Istället skapar du objekt med hjälp av ritningen och lagrar samt hämtar data från dessa objekt – som tidigare förklarats:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }

Även inuti en klass, när dessa fält nås, sker åtkomsten via ett objekt. Till exempel i en konstruktor används i princip de data som skickades av det objekt som anropade konstruktormetoden:

index.cs

index.cs

copy
12345678
public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }

På samma sätt, även i andra metoder, när du får åtkomst till fält, får du i princip åtkomst till objektens fält som anropar dessa metoder, och inte till klassens egna fält eftersom en klass normalt inte innehåller någon data.

Det finns dock ett sätt att lagra data direkt i en klass och göra en egenskap tillgänglig utan att behöva skapa ett objekt. Detta kan göras genom att helt enkelt göra det fältet eller den metoden static:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }

Eftersom ConsoleApp eller huvudklassen i ett program, som representerar själva programmet, inte kan ha några objekt, måste deras metoder och fält vara statiska. Det är därför Main-metoden också är static:

index.cs

index.cs

copy
1234
static void Main() { // code }

1. Kan en klass direkt lagra data?

2. Vilken är den korrekta syntaxen för att ändra fältet value?

question mark

Kan en klass direkt lagra data?

Select the correct answer

question mark

Vilken är den korrekta syntaxen för att ändra fältet value?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 5

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Awesome!

Completion rate improved to 2.04

bookNyckelordet `static`

Svep för att visa menyn

Ett viktigt nyckelord som du kanske redan har stött på flera gånger är static-nyckelordet. I C#-grundkursen nämndes att static används vid definition av globala variabler – variabler som ligger utanför någon specifik metod:

index.cs

index.cs

copy
1234567891011
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }

Det var ett bekvämt sätt att beskriva static-nyckelordet vid det tillfället eftersom det förväntades att läsaren kanske inte hade någon kunskap om objekt eller klasser då. Men nu, om du tittar på koden, kan du inse att val i grunden är ett fält i klassen ConsoleApp. Observera dock att klassen ConsoleApp skiljer sig något från de klasser du normalt skapar. Det beror på att ConsoleApp representerar själva programmet, och det finns inget objekt av ConsoleApp. Du kommer att återkomma till denna del om en stund.

Eftersom en klass endast är en ritning, mer som ett tomt skal, innehåller den normalt inte data i sig själv. Istället skapar du objekt med hjälp av ritningen och lagrar samt hämtar data från dessa objekt – som tidigare förklarats:

index.cs

index.cs

copy
12345678910111213141516171819202122232425262728
using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }

Även inuti en klass, när dessa fält nås, sker åtkomsten via ett objekt. Till exempel i en konstruktor används i princip de data som skickades av det objekt som anropade konstruktormetoden:

index.cs

index.cs

copy
12345678
public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }

På samma sätt, även i andra metoder, när du får åtkomst till fält, får du i princip åtkomst till objektens fält som anropar dessa metoder, och inte till klassens egna fält eftersom en klass normalt inte innehåller någon data.

Det finns dock ett sätt att lagra data direkt i en klass och göra en egenskap tillgänglig utan att behöva skapa ett objekt. Detta kan göras genom att helt enkelt göra det fältet eller den metoden static:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839
using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }

Eftersom ConsoleApp eller huvudklassen i ett program, som representerar själva programmet, inte kan ha några objekt, måste deras metoder och fält vara statiska. Det är därför Main-metoden också är static:

index.cs

index.cs

copy
1234
static void Main() { // code }

1. Kan en klass direkt lagra data?

2. Vilken är den korrekta syntaxen för att ändra fältet value?

question mark

Kan en klass direkt lagra data?

Select the correct answer

question mark

Vilken är den korrekta syntaxen för att ändra fältet value?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 5
some-alt