¿Qué es un "método estático" en C #?

177

¿Qué significa cuando agrega la palabra clave estática a un método?

public static void doSomething(){
   //Well, do something!
}

¿Puedes agregar la staticpalabra clave a la clase? ¿Qué significaría entonces?

Moshe
fuente
9
Puede usar el método estático sin crear una instancia de esa clase simplemente por class_name.static_method_name ();
Javed Akram
A nivel de programación, tenemos la sensación de que podemos llamar a un método estático sin crear una instancia de una clase / tipo. Internamente es no el caso. CLR administra internamente una instancia especial llamada instancia de tipo para administrar la llamada a métodos estáticos. Por favor vea esta respuesta. Es muy intrigante.
RBT

Respuestas:

313

Una staticfunción, a diferencia de una función regular ( instancia ), no está asociada con una instancia de la clase.

Una staticclase es una clase que solo puede contener staticmiembros y, por lo tanto, no se puede crear una instancia.

Por ejemplo:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

Para llamar InstanceMethod, necesita una instancia de la clase:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
SLaks
fuente
28
Entonces, ¿es como un método de clase en lugar de un método de instancia?
Moshe
44
@Moshe: Exactamente. Con un método estático, no necesita una instancia de la clase para llamar al método, solo la clase.
Binario Worrier
3
Pero, ¿existe realmente algún tipo de limitación técnica que impida llamar a un método estático en una instancia? Si el compilador lo permitiera, ¿cuál es el peligro de que sea accesible?
kroonwijk
2
@kroon: No tendría ningún sentido. Los métodos de instancia en realidad solo toman una instancia como primer parámetro oculto. Los métodos estáticos no lo hacen. Vea mi publicación de blog: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks
Donde "StaticMethod" es método de clase e "InstanceMethod" es un método de instancia de clase SomeClass
Usman Younas
26

Desde otro punto de vista: considere que desea realizar algunos cambios en una sola cadena. por ejemplo, desea que las letras sean mayúsculas, etc. crea otra clase llamada "Herramientas" para estas acciones. no tiene sentido hacer una instancia de la clase "Herramientas" porque no hay ningún tipo de entidad disponible dentro de esa clase (compárese con la clase "Persona" o "Profesor"). Entonces usamos palabras clave estáticas para usar la clase "Herramientas" sin hacer ninguna instancia de eso, y cuando presiona punto después del nombre de la clase ("Herramientas") puede tener acceso a los métodos que desee.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}
Behnoud Sherafati
fuente
1
Usar "hacer cambios en una cadena" es un mal ejemplo: las cadenas son inmutables y no se pueden cambiar. Pero, de lo contrario, la explicación tiene sentido (sustituyendo una clase no inmutable por cadena)
Flydog57
13

Un método, campo, propiedad o evento estático se puede invocar en una clase incluso cuando no se ha creado ninguna instancia de la clase. Si se crean instancias de la clase, no se pueden usar para acceder al miembro estático. Solo existe una copia de los campos y eventos estáticos, y los métodos y propiedades estáticos solo pueden acceder a los campos y eventos estáticos. Los miembros estáticos a menudo se usan para representar datos o cálculos que no cambian en respuesta al estado del objeto; por ejemplo, una biblioteca matemática puede contener métodos estáticos para calcular seno y coseno. Los miembros de clase estática se declaran utilizando la palabra clave estática antes del tipo de retorno del membe

Alborz
fuente
5

La función estática significa que está asociada con la clase (no con una instancia particular de la clase, sino con la clase misma) y puede invocarse incluso cuando no existan instancias de clase.

La clase estática significa que la clase contiene solo miembros estáticos.

mih
fuente
5

En breve no puede crear una instancia de la clase estática: Ej:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

No puedes hacer así:

myStaticClass msc = new myStaticClass();  // it will cause an error

Solo puedes hacer:

myStaticClass.someFunction();
r.mirzojonov
fuente
0

Cuando agrega una palabra clave "estática" a un método, significa que la implementación subyacente da el mismo resultado para cualquier instancia de la clase. No hace falta decir que el resultado varía con el cambio en el valor de los parámetros.

Balaji
fuente
-1

La variable estática no se vincula con el objeto de la clase. Se puede acceder usando classname. Todos los objetos de la clase compartirán variables estáticas.

Al hacer que la función sea estática, restringirá el acceso de esa función dentro de ese archivo.

kapilddit
fuente
-1

Núcleo de la palabra clave estática que tendrá solo una copia en RAM de este (método / variable / clase) que se comparte para todas las llamadas

Mahmoud
fuente
-8

La palabra clave estática, cuando se aplica a una clase, le dice al compilador que cree una sola instancia de esa clase. Entonces no es posible 'nuevo' una o más instancias de la clase. Todos los métodos en una clase estática deben ser declarados estáticos.

Es posible, y a menudo deseable, tener métodos estáticos de una clase no estática. Por ejemplo, un método de fábrica cuando crea una instancia de otra clase a menudo se declara estático, ya que esto significa que no se requiere una instancia particular de la clase que contiene el método del factor.

Para una buena explicación de cómo, cuándo y dónde ver MSDN

Dave Arkley
fuente
8
No, una clase estática nunca se instancia. Dado que todo en él es estático, ¿por qué querrías instanciarlo?
Jon Skeet
1
Una staticclase no tiene ninguna instancia en absoluto.
SLaks
44
Lo siento chicos, no entiendo ... Dije que se crea una única instancia y no se puede crear una nueva. ¿Seguramente se crea una única instancia estática, de lo contrario el código no sería invocable?
Dave Arkley
2
Una clase estática tiene una instancia, de hecho dos, simplemente no son instancias del Tipo. Existirá una clase estática en el montón como un objeto de tipo [Foo] (tabla de búsqueda de métodos, etc. para el JIT) y un objeto especial System.Type utilizado para la inicialización.
mccainz
Una clase puede declararse estática, lo que indica que contiene solo miembros estáticos. No es posible crear instancias de una clase estática con la nueva palabra clave. Las clases estáticas se cargan automáticamente mediante .NET Framework Common Language Runtime (CLR) cuando se carga el programa o el espacio de nombres que contiene la clase.
Satheesh