V C# a dalších objektově orientovaných jazycích se členy tříd (tj. proměnné, metody, vlastnosti, události) dělí podle toho, zda jsou vázány na konkrétní instanci třídy, nebo na samotnou třídu jako typ.

Dle toho je lze rozdělit na:

  • instanční (instance) kontext
  • statický (static) kontext

Instanční kontext

Instanční člen:

  • patří konkrétnímu objektu (instanci třídy)
  • existuje tedy tolikrát, kolikrát je v paměti vytvořena instanci třídy
  • vyžaduje existující objekt, aby šla použít
public class Car
{
    public string Color;
 
    public void Drive()
    {
        Console.WriteLine("Auto jede.");
    }
}

Ukázka použití:

var myCar = new Car();
myCar.Color = "Red";
myCar.Drive();
  • Color a Drive jsou instanční členy → lze je volat až na objektu

Klíčové slovo this

Slouží pro explicitní přístup ke konkrétní instanci.

public class Person
{
  private string name;
 
  public Person(string name)
  {
      this.name = name;
  }
}

Statický kontext

Statický člen (proměnná, metoda, vlastnost):

  • patří třídě jako takové, ne konkrétní instanci
  • existuje v paměti pouze jednou
  • může být použit i bez vytvoření instance třídy

Pro označení, že člen je statický se využívá klíčové slovo static.

public class MathUtils
{
    public static double Pi = 3.14159;
 
    public static double Square(double x)
    {
        return x * x;
    }
}

Ukázka použití:

double area = MathUtils.Pi * MathUtils.Square(5);
Console.WriteLine(area);
  • k Pi nebo Square se přistupuje přímo přes název třídy

Používání static

Statické členy mohou přistupovat pouze ke statickým členům. Instanční členy mohou přistupovat jak k instančním, tak ke statickým členům.

Statická třída

Třída, která nemůže být nikdy instancována a může obsahovat pouze statické členy.

public static class Helper
{
    public static void PrintHello()
    {
        Console.WriteLine("Hello!");
    }
}

Ukázka použití:

Helper.PrintHello();
 
var helper = new Helper(); // Chyba - nelze

Ukázka kombinace

public class Car
{
    public string Color;             // instanční field
    public static int TotalCars;     // statický field
 
    public void Paint(string color)
    {
        Color = color;               // lze používat instanční field
        TotalCars++;                 // lze používat statický field
    }
 
    public static void ShowTotal()
    {
        Console.WriteLine(TotalCars);
 
        Color = "red";            // chyba! Nelze přistupovat k instančnímu fieldu ze statické metody
    }
}

Ukázka použití:

Car.ShowTotal();             // statická metoda bez instance
 
var car1 = new Car();
car1.Paint("Blue");