Co to jest „metoda statyczna” w C #?

177

Co to znaczy, kiedy dodajesz słowo kluczowe static do metody?

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

Czy możesz dodać staticsłowo kluczowe do zajęć? Co to by wtedy oznaczało?

Mosze
źródło
9
Możesz użyć metody statycznej bez tworzenia instancji tej klasy po prostu przez class_name.static_method_name ();
Javed Akram
Na poziomie programowania mamy wrażenie, że jesteśmy w stanie wywołać metodę statyczną bez tworzenia instancji klasy / typu. Wewnętrznie tak nie jest . Środowisko CLR wewnętrznie zarządza specjalną instancją zwaną instancją typu do zarządzania wywołaniami metod statycznych. Zobacz odpowiedź. To takie intrygujące.
RBT

Odpowiedzi:

313

staticFunkcji, w przeciwieństwie do zwykłej ( np FUNCTION), a nie wiąże się z wystąpieniem klasy.

staticKlasa to klasa, która może zawierać tylko staticczłonkom, a zatem nie może być instancja.

Na przykład:

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

Aby zadzwonić InstanceMethod, potrzebujesz instancji klasy:

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

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
SLaks
źródło
28
Więc to jest jak metoda klasowa zamiast metody instancji?
Moshe
4
@Moshe: Dokładnie. W przypadku metody statycznej nie potrzebujesz instancji klasy do wywołania metody, a jedynie klasę.
Binary Worrier
3
Ale czy rzeczywiście istnieje jakieś techniczne ograniczenie, które uniemożliwia wywołanie metody statycznej na instancji? Jeśli kompilator na to pozwoli, jakie jest niebezpieczeństwo, że będzie dostępny?
kroonwijk
2
@kroon: To nie miałoby sensu. Metody instancji w rzeczywistości przyjmują instancję jako ukryty pierwszy parametr. Metody statyczne nie. Zobacz mój wpis na blogu: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks
Gdzie „StaticMethod” jest metodą klasy, a „InstanceMethod” jest metodą instancji klasy SomeClass
Usman Younas
26

Z innego punktu widzenia: zastanów się, czy chcesz wprowadzić pewne zmiany na pojedynczym łańcuchu. na przykład chcesz, aby litery były wielkimi literami i tak dalej. tworzysz inną klasę o nazwie „Narzędzia” dla tych działań. nie ma sensu tworzyć instancji klasy „Narzędzia”, ponieważ w tej klasie nie ma żadnego elementu dostępnego (porównaj z klasą „Osoba” lub „Nauczyciel”). Używamy więc statycznego słowa kluczowego, aby używać klasy "Narzędzia" bez tworzenia jej instancji, a po naciśnięciu kropki po nazwie klasy ("Narzędzia") można uzyskać dostęp do żądanych metod.

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
źródło
1
Używanie „dokonywania zmian w łańcuchu” jest złym przykładem - łańcuchy znaków są niezmienne i nie można ich zmienić. Ale w przeciwnym razie wyjaśnienie ma sens (zastąpienie niezmiennej klasy ciągiem znaków)
Flydog57
13

Statyczną metodę, pole, właściwość lub zdarzenie można wywołać dla klasy, nawet jeśli nie utworzono żadnego wystąpienia tej klasy. Jeśli zostaną utworzone jakiekolwiek wystąpienia klasy, nie można ich użyć do uzyskania dostępu do statycznego elementu członkowskiego. Istnieje tylko jedna kopia statycznych pól i zdarzeń, a statyczne metody i właściwości mogą uzyskiwać dostęp tylko do pól statycznych i zdarzeń statycznych. Statyczne elementy członkowskie są często używane do reprezentowania danych lub obliczeń, które nie zmieniają się w odpowiedzi na stan obiektu; na przykład biblioteka matematyczna może zawierać statyczne metody obliczania sinusa i cosinusa. Elementy członkowskie klasy statycznej są deklarowane przy użyciu słowa kluczowego static przed zwracanym typem membe

Alborz
źródło
5

Funkcja statyczna oznacza, że ​​jest powiązana z klasą (nie z konkretną instancją klasy, ale z samą klasą) i może być wywoływana nawet wtedy, gdy nie istnieją żadne instancje klas.

Klasa statyczna oznacza, że ​​klasa zawiera tylko statyczne elementy członkowskie.

mih
źródło
5

Wkrótce nie można utworzyć instancji klasy statycznej: Ex:

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

Nie możesz zrobić tak:

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

Możesz zrobić tylko:

myStaticClass.someFunction();
r.mirzojonov
źródło
0

Dodanie słowa kluczowego „static” do metody oznacza, że ​​podstawowa implementacja daje ten sam wynik dla każdej instancji klasy. Nie trzeba dodawać, że wynik zmienia się wraz ze zmianą wartości parametrów

Balaji
źródło
-1

Zmienna statyczna nie jest powiązana z obiektem klasy. Można uzyskać do niego dostęp za pomocą nazwy klasy. Wszystkie obiekty klasy będą współużytkować zmienną statyczną.

Uczyniając funkcję statyczną, ograniczy dostęp tej funkcji w tym pliku.

kapilddit
źródło
-1

Rdzeń statycznego słowa kluczowego, że będziesz mieć tylko jedną kopię w pamięci RAM tej (metody / zmiennej / klasy), która jest wspólna dla wszystkich wywołań

Mahmoud
źródło
-8

Słowo kluczowe static zastosowane do klasy informuje kompilator, aby utworzył pojedyncze wystąpienie tej klasy. Nie jest wtedy możliwe „nowe” jednej lub więcej instancji tej klasy. Wszystkie metody w klasie statycznej muszą być zadeklarowane jako statyczne.

Możliwe i często pożądane jest posiadanie statycznych metod klasy niestatycznej. Na przykład metoda fabryczna podczas tworzenia instancji innej klasy jest często deklarowana jako statyczna, ponieważ oznacza to, że określone wystąpienie klasy zawierającej metodę współczynnika nie jest wymagane.

Aby uzyskać dobre wyjaśnienie, jak, kiedy i gdzie, zobacz MSDN

Dave Arkley
źródło
8
Nie, klasa statyczna nigdy nie jest tworzona. Biorąc pod uwagę, że wszystko w nim jest statyczne, dlaczego miałbyś chcieć go utworzyć?
Jon Skeet
1
staticKlasa ma instancji w ogóle.
SLaks
4
Przepraszam, nie rozumiem ... Powiedziałem, że utworzono jedną instancję i nie można utworzyć nowej. Z pewnością zostanie utworzona pojedyncza, statyczna instancja, w przeciwnym razie kod nie byłby wywoływalny?
Dave Arkley
2
Klasa statyczna ma instancję, w rzeczywistości dwie nie są po prostu instancjami typu. Klasa statyczna będzie istnieć na stercie jako obiekt typu [Foo] Type (tablica wyszukiwania metod itp. Dla JIT) oraz specjalny obiekt System.Type używany do inicjalizacji.
mccainz
Klasę można zadeklarować jako statyczną, co oznacza, że ​​zawiera tylko statyczne elementy członkowskie. Nie jest możliwe tworzenie instancji klasy statycznej przy użyciu słowa kluczowego new. Klasy statyczne są ładowane automatycznie przez środowisko wykonawcze języka wspólnego (CLR) platformy .NET Framework podczas ładowania programu lub przestrzeni nazw zawierającej klasę.
Satheesh