O que é um "método estático" em C #?

177

O que significa quando você adiciona a palavra-chave estática a um método?

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

Você pode adicionar a staticpalavra-chave à classe? O que isso significaria então?

Moshe
fonte
9
Você pode usar o método estático sem criar uma instância dessa classe simplesmente por class_name.static_method_name ();
JavaScript é necessário
No nível de programação, temos a sensação de que podemos chamar um método estático sem criar uma instância de uma classe / tipo. Internamente, não é o caso. O CLR gerencia internamente uma instância especial chamada instância de tipo para gerenciar a chamada para métodos estáticos. Por favor, veja esta resposta. É tão intrigante.
RBT

Respostas:

313

Uma staticfunção, diferente da função regular ( instância ), não está associada a uma instância da classe.

Uma staticclasse é uma classe que pode conter apenasstatic membros e, portanto, não pode ser instanciada.

Por exemplo:

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

Para ligar InstanceMethod, você precisa de uma instância da classe:

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

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
SLaks
fonte
28
Então é como um método de classe em vez de um método de instância?
Moshe
4
@ Moshe: Exatamente. Com um método estático, você não precisa de uma instância da classe para chamar o método, apenas a classe.
Binary Worrier
3
Mas, na verdade, existe algum tipo de limitação técnica que impede a chamada de um método estático em uma instância? Se o compilador permitir, qual é o perigo de ser acessível?
kroonwijk 12/09
2
@kroon: Não faria sentido. Os métodos de instância, na verdade, apenas tomam uma instância como um primeiro parâmetro oculto. Métodos estáticos não. Veja minha publicação no blog: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks
Onde "StaticMethod" é o método de classe e "InstanceMethod" é um método de instância da classe SomeClass
Usman Younas
26

De outro ponto de vista: considere que você deseja fazer algumas alterações em uma única String. por exemplo, você deseja fazer as letras maiúsculas e assim por diante. você cria outra classe chamada "Ferramentas" para essas ações. não há sentido em criar instância da classe "Ferramentas" porque não há nenhum tipo de entidade disponível dentro dessa classe (compare com a classe "Pessoa" ou "Professor"). Portanto, usamos a palavra-chave estática para usar a classe "Tools" sem fazer nenhuma instância disso, e quando você pressiona ponto após o nome da classe ("Tools"), pode ter acesso aos métodos que deseja.

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
fonte
1
Usar "fazer alterações em uma string" é um mau exemplo - as strings são imutáveis ​​e não podem ser alteradas. Mas, caso contrário, a explicação faz sentido (substituindo uma classe não-imutável para string)
Flydog57
13

Um método estático, campo, propriedade ou evento pode ser chamado em uma classe, mesmo quando nenhuma instância da classe foi criada. Se alguma instância da classe for criada, ela não poderá ser usada para acessar o membro estático. Existe apenas uma cópia dos campos e eventos estáticos, e métodos e propriedades estáticos podem acessar apenas campos estáticos e eventos estáticos. Membros estáticos são frequentemente usados ​​para representar dados ou cálculos que não mudam em resposta ao estado do objeto; por exemplo, uma biblioteca de matemática pode conter métodos estáticos para calcular seno e cosseno. Membros de classe estática são declarados usando a palavra-chave static antes do tipo de retorno do membe

Alborz
fonte
5

Função estática significa que está associada à classe (não uma instância específica da classe, mas a própria classe) e pode ser invocada mesmo quando não existem instâncias da classe.

Classe estática significa que a classe contém apenas membros estáticos.

mih
fonte
5

Em breve você não pode instanciar a classe estática: Ex:

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

Você não pode fazer assim:

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

Você pode fazer apenas:

myStaticClass.someFunction();
r.mirzojonov
fonte
0

Quando você adiciona uma palavra-chave "estática" a um método, significa que a implementação subjacente fornece o mesmo resultado para qualquer instância da classe. Escusado será dizer que o resultado varia com a mudança no valor dos parâmetros

Balaji
fonte
-1

A variável estática não se vincula ao objeto da classe. Pode ser acessado usando o nome da classe. Todo objeto da classe compartilhará variável estática.

Tornando a função como estática, restringirá o acesso dessa função dentro desse arquivo.

kapilddit
fonte
-1

Núcleo da palavra-chave estática em que você terá apenas uma cópia na RAM deste (método / variável / classe) compartilhada para todas as chamadas

Mahmoud
fonte
-8

A palavra-chave estática, quando aplicada a uma classe, diz ao compilador para criar uma única instância dessa classe. Não é possível 'nova' uma ou mais instâncias da classe. Todos os métodos em uma classe estática devem ser declarados estáticos.

É possível, e geralmente desejável, ter métodos estáticos de uma classe não estática. Por exemplo, um método de fábrica quando cria uma instância de outra classe geralmente é declarado estático, pois isso significa que uma instância específica da classe que contém o método fator não é necessária.

Para uma boa explicação de como, quando e onde, consulte o MSDN

Dave Arkley
fonte
8
Não, uma classe estática nunca é instanciada. Como tudo está estático, por que você deseja instanciar?
Jon Skeet
1
Uma staticclasse não tem nenhuma instância.
SLaks
4
Desculpe pessoal, eu não entendo ... Eu disse que uma única instância é criada e você não pode criar uma nova. Certamente, uma única instância estática é criada, caso contrário, o código não pode ser chamado?
quer
2
Uma classe estática tem uma instância, na verdade duas, elas simplesmente não são instâncias do Type. Uma classe estática existirá no heap como um objeto do tipo [Foo] (tabela de pesquisa de métodos etc para o JIT) e um objeto System.Type especial usado para inicialização.
Mccainz #
Uma classe pode ser declarada estática, indicando que ela contém apenas membros estáticos. Não é possível criar instâncias de uma classe estática usando a nova palavra-chave. As classes estáticas são carregadas automaticamente pelo CLR (Common Language Runtime) do .NET Framework quando o programa ou espaço para nome que contém a classe é carregado.
Satheesh