static (Referencia de C#)static (C# Reference)

En esta página se trata la palabra clave del modificador static.This page covers the static modifier keyword. La palabra clave static también forma parte de la directiva using static.The static keyword is also part of the using static directive.

Use el modificador static para declarar un miembro estático, que pertenece al propio tipo en lugar de a un objeto específico.Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. El modificador static se puede usar para declarar clases static.The static modifier can be used to declare static classes. En las clases, las interfaces y las estructuras, puede agregar el modificador static a los campos, los métodos, las propiedades, los operadores, los eventos y los constructores.In classes, interfaces, and structs, you may add the static modifier to fields, methods, properties, operators, events, and constructors. El modificador static no se puede usar con indizadores ni finalizadores.The static modifier can't be used with indexers or finalizers. Para más información, vea Clases estáticas y sus miembros.For more information, see Static Classes and Static Class Members.

Ejemplo: clase estáticaExample - static class

La siguiente clase se declara como static y contiene solo 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() { /*...*/  }
}

Una declaración de constantes o tipos es implícitamente un miembro static.A constant or type declaration is implicitly a static member. No se puede hacer referencia a un miembro static mediante una instancia,A static member can't be referenced through an instance. sino que se hace a través del nombre de tipo.Instead, it's referenced through the type name. Por ejemplo, considere la siguiente clase:For example, consider the following class:

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

Para hacer referencia al miembro static x, use el nombre completo, MyBaseC.MyStruct.x, a menos que el miembro sea accesible desde el mismo ámbito: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);

Mientras que una instancia de una clase contiene una copia independiente de todos los campos de instancia de la clase, solo hay una copia de cada campo static.While an instance of a class contains a separate copy of all instance fields of the class, there's only one copy of each static field.

No se puede usar this para hacer referencia a métodos static o descriptores de acceso de propiedades.It isn't possible to use this to reference static methods or property accessors.

Si la palabra clave static se aplica a una clase, todos los miembros de esta deben ser static.If the static keyword is applied to a class, all the members of the class must be static.

Las clases, las interfaces y las clases static pueden tener constructores static.Classes, interfaces, and static classes may have static constructors. Se llama a un constructor static en algún momento entre el inicio del programa y la creación de una instancia de la clase.A static constructor is called at some point between when the program starts and the class is instantiated.

Nota

La palabra clave static tiene usos más limitados que en C++.The static keyword has more limited uses than in C++. Para ver una comparación con la palabra clave de C++, vea Clases de almacenamiento (C++).To compare with the C++ keyword, see Storage classes (C++).

Para mostrar miembros static, es recomendable una clase que represente al empleado de una empresa.To demonstrate static members, consider a class that represents a company employee. Supongamos que la clase contiene un método de recuento de empleados y un campo para almacenar el número de empleados.Assume that the class contains a method to count employees and a field to store the number of employees. El método y el campo no pertenecen a ninguna instancia de ningún empleado,Both the method and the field don't belong to any one employee instance. sino que pertenecen a la clase de empleados en su conjunto.Instead, they belong to the class of employees as a whole. Se deben declarar como miembros static de la clase.They should be declared as static members of the class.

Ejemplo: campo estático y métodoExample - static field and method

En este ejemplo se lee el nombre y el identificador de un nuevo empleado, se incrementa en uno el recuento de empleados y se muestra la información del nuevo empleado, así como el nuevo número de empleados.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. Este programa lee el número actual de empleados desde el teclado.This program reads the current number of employees from the keyboard.

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

Ejemplo: inicialización estáticaExample - static initialization

En este ejemplo se muestra que se puede inicializar un campo static mediante otro campo static que aún no se ha declarado.This example shows that you can initialize a static field by using another static field that is not yet declared. Los resultados están sin definir hasta que se asigna explícitamente un valor al campo static.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
*/

Especificación del lenguaje C#C# language specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also