Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Esta página aborda a palavra-chave do modificador static. A static palavra-chave também faz parte da using static diretiva.
Use o static modificador para declarar um membro estático, que pertence ao tipo em si, em vez de a um objeto específico. O static modificador pode ser usado para declarar static classes. Em classes, interfaces e structs, você pode adicionar o static modificador a campos, métodos, propriedades, operadores, eventos e construtores. O static modificador não pode ser usado com indexadores ou finalizadores. Para obter mais informações, consulte Classes estáticas e membros de classe estática.
Você pode adicionar o static modificador a uma função local. Uma função local estática não pode capturar variáveis locais ou o estado da instância.
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
*/
Você pode adicionar o static modificador a uma expressão lambda ou método anônimo. Um método lambda estático ou anônimo não pode capturar variáveis locais ou o estado da instância.
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
*/
Exemplo – classe estática
A classe a seguir é declarada como static e contém apenas static métodos:
static class CompanyEmployee
{
public static void DoSomething() { /*...*/ }
public static void DoSomethingElse() { /*...*/ }
}
Uma constante ou declaração de tipo é, implicitamente, um membro static. Um membro static não pode ser referenciado por meio de uma instância. Em vez disso, ele é referenciado pelo nome do tipo. Por exemplo, considere a seguinte classe:
public class MyBaseC
{
public struct MyStruct
{
public static int x = 100;
}
}
Para fazer referência ao static do membro x, use o nome totalmente qualificado MyBaseC.MyStruct.x, a menos que o membro esteja acessível a partir do mesmo escopo:
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 static campo. Para tipos genéricos, cada tipo genérico fechado tem sua própria cópia de campos estáticos. Campos estáticos marcados com ThreadStaticAttribute têm uma cópia por thread.
Não é possível usar this para referenciar métodos static ou acessadores de propriedade.
Se a static palavra-chave for aplicada a uma classe, todos os membros da classe deverão ser static.
Classes, interfaces e static classes podem ter static construtores. Um static construtor é chamado em algum momento entre quando o programa é iniciado e a classe é instanciada.
Observação
A static palavra-chave tem usos mais limitados do que no C++. Para comparar com a palavra-chave C++, consulte classes de armazenamento (C++).
Para demonstrar os membros static, considere uma classe que representa um funcionário da empresa. Suponha que a classe contenha um método para contar funcionários e um campo para armazenar o número de funcionários. O método e o campo não pertencem a nenhuma instância de funcionário. Em vez disso, pertencem à classe de funcionários como um todo. Portanto, eles devem ser declarados como membros static da classe.
Exemplo – campo estático e método
Este exemplo lê o nome e a ID de um novo funcionário, incrementa o contador de funcionários por um e exibe as informações para o novo funcionário e o novo número de funcionários. Este programa lê o número atual de funcionários do teclado.
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
*/
Exemplo – inicialização estática
Este exemplo mostra que você pode inicializar um static campo usando outro static campo que ainda não foi declarado. Os resultados serão indefinidos até que você atribua explicitamente um valor ao static campo.
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#
Para obter mais informações, consulte a Especificação da Linguagem C# . A especificação de idioma é a fonte definitiva para a sintaxe e o uso de C#.