static (Referência de C#)static (C# Reference)

Use o modificador static para declarar um membro estático que pertença ao próprio tipo, em vez de um objeto específico.Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. O modificador static pode ser usado com classes, campos, métodos, propriedades, operadores, eventos e construtores, mas não pode ser usado com indexadores, finalizadores ou tipos diferentes de classes.The static modifier can be used with classes, fields, methods, properties, operators, events, and constructors, but it cannot be used with indexers, finalizers, or types other than classes. Para obter mais informações, consulte Classes estáticas e membros de classes estáticas.For more information, see Static Classes and Static Class Members.

ExemploExample

A seguinte classe é declarada como static e contém apenas métodos static:The following class is declared as static and contains only static methods:

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

Uma constante ou declaração de tipo é, implicitamente, um membro estático.A constant or type declaration is implicitly a static member.

Um membro estático não pode ser referenciado por meio de uma instância.A static member cannot be referenced through an instance. Em vez disso, ele é referenciado pelo nome do tipo.Instead, it is referenced through the type name. Por exemplo, considere a seguinte classe:For example, consider the following class:

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

Para fazer referência ao membro estático x, use o nome totalmente qualificado MyBaseC.MyStruct.x, a menos que o membro esteja acessível no mesmo escopo:To refer to the static member x, use the fully qualified name, MyBaseC.MyStruct.x, unless the member is accessible from the same scope:

Console.WriteLine(MyBaseC.MyStruct.x);

Embora uma instância de uma classe contenha uma cópia separada de todos os campos de instância da classe, há apenas uma cópia de cada campo estático.While an instance of a class contains a separate copy of all instance fields of the class, there is only one copy of each static field.

Não é possível usar this para referenciar métodos estáticos ou acessadores de propriedade.It is not possible to use this to reference static methods or property accessors.

Se a palavra-chave static for aplicada a uma classe, todos os membros da classe deverão ser estáticos.If the static keyword is applied to a class, all the members of the class must be static.

As classes e as classes estáticas podem ter construtores estáticos.Classes and static classes may have static constructors. Os construtores estáticos são chamados em algum ponto entre o momento em que o programa é iniciado e a classe é instanciada.Static constructors are called at some point between when the program starts and the class is instantiated.

Observação

A palavra-chave static tem utilizações mais limitadas do que no C++.The static keyword has more limited uses than in C++. Para comparar com a palavra-chave do C++, consulte Storage classes (C++) (Classes de armazenamento (C++)).To compare with the C++ keyword, see Storage classes (C++).

Para demonstrar os membros estáticos, considere uma classe que representa um funcionário da empresa.To demonstrate static members, consider a class that represents a company employee. Suponha que a classe contém um método para contar funcionários e um campo para armazenar o número de funcionários.Assume that the class contains a method to count employees and a field to store the number of employees. O método e o campo não pertencem a qualquer instância funcionário.Both the method and the field do not belong to any instance employee. Em vez disso, eles pertencem à classe empresa.Instead they belong to the company class. Portanto, eles devem ser declarados como membros estáticos da classe.Therefore, they should be declared as static members of the class.

ExemploExample

Este exemplo lê o nome e a ID de um novo funcionário, incrementa o contador de funcionário em um e exibe as informações do novo funcionário e do novo número de funcionários.This example reads the name and ID of a new employee, increments the employee counter by one, and displays the information for the new employee and the new number of employees. Para simplificar, este programa lê, do teclado, o número atual de funcionários.For simplicity, this program reads the current number of employees from the keyboard. Em um aplicativo real, essas informações devem ser lidas de um arquivo.In a real application, this information should be read from a file.

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
*/

ExemploExample

Este exemplo mostra que, embora seja possível inicializar um campo estático usando outro campo estático que ainda não foi declarado, os resultados serão indefinidos até que você atribua explicitamente um valor ao campo estático.This example shows that although you can initialize a static field by using another static field not yet declared, the results will be undefined until you explicitly assign a value to the static field.

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
*/

Especificação da linguagem C#C# language specification

Para obter mais informações, consulte a Especificação da linguagem C#.For more information, see the C# Language Specification. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.The language specification is the definitive source for C# syntax and usage.

Consulte tambémSee also