Sdílet prostřednictvím


static (Referenční dokumentace jazyka C#)

Tato stránka popisuje static modifikační klíčové slovo. Klíčové static slovo je také součástí direktivy using static .

Pomocí modifikátoru static deklarujte statický člen, který patří samotnému typu, nikoli ke konkrétnímu objektu. static Modifikátor lze použít k deklaraci static tříd. V třídách, rozhraních a strukturách můžete modifikátor přidat static do polí, metod, vlastností, operátorů, událostí a konstruktorů. static Modifikátor nelze použít s indexery ani finalizátory. Další informace naleznete v tématu Statické třídy a statičtí členové tříd.

Modifikátor můžete přidat static do místní funkce. Statická místní funkce nemůže zachytit místní proměnné ani stav instance.

class Calc1
{
    public void CalculateSum()
    {
        int a = 3;
        int b = 7;

        // Static local function - cannot access 'a' or 'b' directly
        static int Add(int x, int y)
        {
            return x + y;
        }

        int result = Add(a, b); 
        Console.WriteLine($"Sum: {result}");
    }
}
  /*
 Output:
 Sum: 10
 */

Modifikátor můžete přidat k staticlambda výrazu nebo anonymní metodě. Statická lambda nebo anonymní metoda nemůže zachytit místní proměnné ani stav instance.

class Calc2
{
    static void Main()
    {
        Func<int, int, int> add = static (a, b) => a + b;

        int result = add(5, 10);
        Console.WriteLine($"Sum: {result}");
    }
}
/*
Output:
Sum: 15
*/

Příklad – statická třída

Následující třída je deklarována jako static a obsahuje pouze static metody:

static class CompanyEmployee
{
    public static void DoSomething() { /*...*/ }
    public static void DoSomethingElse() { /*...*/  }
}

Deklarace konstanty nebo typu je implicitně static členem. Na static člena nejde odkazovat prostřednictvím instance. Místo toho je odkazován pomocí názvu typu. Představte si například následující třídu:

public class MyBaseC
{
    public struct MyStruct
    {
        public static int x = 100;
    }
}

Pokud chcete odkazovat na static člena x, použijte plně kvalifikovaný název, MyBaseC.MyStruct.xpokud není člen přístupný ze stejného oboru:

Console.WriteLine(MyBaseC.MyStruct.x);

Zatímco instance třídy obsahuje samostatnou kopii všech polí instance třídy, existuje pouze jedna kopie každého static pole. U obecných typů má každý uzavřený obecný typ vlastní kopii statických polí. Statická pole označená ThreadStaticAttribute mají jednu kopii na vlákno.

Není možné použít this k odkazování static na metody nebo přístupové objekty vlastností.

Pokud je klíčové slovo static použito na třídu, všechny členy třídy musí být static.

Třídy, rozhraní a static třídy mohou mít static konstruktory. static Konstruktor se v určitém okamžiku volá mezi spuštěním programu a vytvořením instance třídy.

Poznámka:

Klíčové static slovo má více omezených použití než v jazyce C++. Porovnání s klíčovým slovem C++ najdete v tématu Třídy úložiště (C++).

Pokud chcete předvést static členy, zvažte třídu, která představuje zaměstnance společnosti. Předpokládejme, že třída obsahuje metodu pro počítání zaměstnanců a pole pro uložení počtu zaměstnanců. Metoda i pole nepatří do žádné konkrétní instance zaměstnance. Místo toho patří do třídy zaměstnanců jako celku. Měly by být deklarovány jako static členy třídy.

Příklad – statické pole a metoda

Tento příklad přečte jméno a ID nového zaměstnance, zvýší čítač zaměstnance o jeden a zobrazí informace pro nového zaměstnance a nový počet zaměstnanců. Tento program přečte aktuální počet zaměstnanců z klávesnice.

public class Employee4
{
    public string id;
    public string name;

    public Employee4()
    {
    }

    public Employee4(string name, string id)
    {
        this.name = name;
        this.id = id;
    }

    public static int employeeCounter;

    public static int AddEmployee()
    {
        return ++employeeCounter;
    }
}

class MainClass : Employee4
{
    static void Main()
    {
        Console.Write("Enter the employee's name: ");
        string name = Console.ReadLine();
        Console.Write("Enter the employee's ID: ");
        string id = Console.ReadLine();

        // Create and configure the employee object.
        Employee4 e = new Employee4(name, id);
        Console.Write("Enter the current number of employees: ");
        string n = Console.ReadLine();
        Employee4.employeeCounter = Int32.Parse(n);
        Employee4.AddEmployee();

        // Display the new information.
        Console.WriteLine($"Name: {e.name}");
        Console.WriteLine($"ID:   {e.id}");
        Console.WriteLine($"New Number of Employees: {Employee4.employeeCounter}");
    }
}
/*
Input:
Matthias Berndt
AF643G
15
 *
Sample Output:
Enter the employee's name: Matthias Berndt
Enter the employee's ID: AF643G
Enter the current number of employees: 15
Name: Matthias Berndt
ID:   AF643G
New Number of Employees: 16
*/

Příklad – statická inicializace

Tento příklad ukazuje, že pole můžete inicializovat static pomocí jiného static pole, které ještě není deklarováno. Výsledky nebudou definovány, dokud explicitně nepřiřadíte hodnotu k static poli.

class Test
{
    static int x = y;
    static int y = 5;

    static void Main()
    {
        Console.WriteLine(Test.x);
        Console.WriteLine(Test.y);

        Test.x = 99;
        Console.WriteLine(Test.x);
    }
}
/*
Output:
    0
    5
    99
*/

Specifikace jazyka C#

Další informace najdete ve specifikaci jazyka C# . Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.

Viz také