Was ist eine "statische Methode" in C #?

177

Was bedeutet es, wenn Sie einer Methode das statische Schlüsselwort hinzufügen?

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

Können Sie das staticSchlüsselwort zur Klasse hinzufügen ? Was würde es dann bedeuten?

Moshe
quelle
9
Sie können die statische Methode verwenden, ohne eine Instanz dieser Klasse zu erstellen, indem Sie einfach class_name.static_method_name () verwenden.
Javed Akram
Auf Programmierebene haben wir das Gefühl, dass wir eine statische Methode aufrufen können, ohne eine Instanz einer Klasse / eines Typs zu erstellen. Intern ist dies nicht der Fall. CLR verwaltet intern eine spezielle Instanz namens Typinstanz zum Verwalten des Aufrufs statischer Methoden. Bitte sehen Sie diese Antwort. Es ist so faszinierend.
RBT

Antworten:

313

Eine staticFunktion ist im Gegensatz zu einer regulären ( Instanz- ) Funktion keiner Instanz der Klasse zugeordnet.

Eine staticKlasse ist eine Klasse, die nur staticMitglieder enthalten kann und daher nicht instanziiert werden kann.

Beispielsweise:

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

Zum Aufrufen InstanceMethodbenötigen Sie eine Instanz der Klasse:

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

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine
SLaks
quelle
28
Es ist also wie eine Klassenmethode anstelle einer Instanzmethode?
Moshe
4
@ Moshe: Genau. Bei einer statischen Methode benötigen Sie keine Instanz der Klasse, um die Methode aufzurufen, sondern nur die Klasse.
Binary Worrier
3
Aber gibt es tatsächlich eine technische Einschränkung, die das Aufrufen einer statischen Methode für eine Instanz verhindert? Wenn der Compiler dies zulassen würde, wie hoch ist die Gefahr, dass darauf zugegriffen werden kann?
Kroonwijk
2
@ Kroon: Es würde keinen Sinn ergeben. Instanzmethoden nehmen tatsächlich nur eine Instanz als versteckten ersten Parameter. Statische Methoden nicht. Siehe meinen Blog-Beitrag: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks
Wobei "StaticMethod" die Klassenmethode und "InstanceMethod" eine Instanzmethode der Klasse SomeClass ist
Usman Younas
26

Aus einem anderen Blickwinkel: Bedenken Sie, dass Sie einige Änderungen an einem einzelnen String vornehmen möchten. Zum Beispiel möchten Sie die Buchstaben in Großbuchstaben schreiben und so weiter. Sie erstellen eine andere Klasse mit dem Namen "Tools" für diese Aktionen. Es hat keine Bedeutung, eine Instanz der Klasse "Tools" zu erstellen, da in dieser Klasse keine Entität verfügbar ist (vergleiche mit der Klasse "Person" oder "Teacher"). Daher verwenden wir das statische Schlüsselwort, um die Klasse "Tools" zu verwenden, ohne eine Instanz davon zu erstellen. Wenn Sie Punkt nach Klassenname ("Tools") drücken, können Sie auf die gewünschten Methoden zugreifen.

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
quelle
1
Die Verwendung von "Änderungen an einer Zeichenfolge vornehmen" ist ein schlechtes Beispiel - Zeichenfolgen sind unveränderlich und können nicht geändert werden. Aber ansonsten macht die Erklärung Sinn (Ersetzen einer Zeichenfolge durch eine nicht unveränderliche Klasse)
Flydog57
13

Eine statische Methode, ein Feld, eine Eigenschaft oder ein Ereignis kann für eine Klasse aufgerufen werden, auch wenn keine Instanz der Klasse erstellt wurde. Wenn Instanzen der Klasse erstellt werden, können sie nicht für den Zugriff auf das statische Element verwendet werden. Es ist nur eine Kopie statischer Felder und Ereignisse vorhanden, und statische Methoden und Eigenschaften können nur auf statische Felder und statische Ereignisse zugreifen. Statische Elemente werden häufig verwendet, um Daten oder Berechnungen darzustellen, die sich nicht als Reaktion auf den Objektstatus ändern. Beispielsweise kann eine Mathematikbibliothek statische Methoden zur Berechnung von Sinus und Cosinus enthalten. Statische Klassenmitglieder werden mit dem Schlüsselwort static vor dem Rückgabetyp der membe deklariert

Alborz
quelle
5

Statische Funktion bedeutet, dass sie der Klasse zugeordnet ist (keine bestimmte Instanz der Klasse, sondern die Klasse selbst) und auch dann aufgerufen werden kann, wenn keine Klasseninstanzen vorhanden sind.

Statische Klasse bedeutet, dass die Klasse nur statische Elemente enthält.

mih
quelle
5

In Kürze können Sie die statische Klasse nicht instanziieren: Beispiel:

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

Sie können nicht so machen:

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

Sie können nur machen:

myStaticClass.someFunction();
r.mirzojonov
quelle
0

Wenn Sie einer Methode ein "statisches" Schlüsselwort hinzufügen, bedeutet dies, dass die zugrunde liegende Implementierung für jede Instanz der Klasse dasselbe Ergebnis liefert. Es ist unnötig zu erwähnen, dass das Ergebnis mit der Änderung des Parameterwerts variiert

Balaji
quelle
-1

Die statische Variable ist nicht mit dem Objekt der Klasse verknüpft. Der Zugriff erfolgt über den Klassennamen. Alle Objekte der Klasse teilen sich eine statische Variable.

Wenn Sie die Funktion als statisch festlegen, wird der Zugriff auf diese Funktion in dieser Datei eingeschränkt.

kapilddit
quelle
-1

Kern des statischen Stichwort , dass Sie nur eine Kopie an haben RAM dieser (Methode / Variable / Klasse) , das ist geteilt für alle anruf

Mahmoud
quelle
-8

Das statische Schlüsselwort weist den Compiler an, wenn er auf eine Klasse angewendet wird, eine einzelne Instanz dieser Klasse zu erstellen. Es ist dann nicht möglich, eine oder mehrere Instanzen der Klasse neu zu erstellen. Alle Methoden in einer statischen Klasse müssen selbst als statisch deklariert werden.

Es ist möglich und oft wünschenswert, statische Methoden einer nicht statischen Klasse zu haben. Beispielsweise wird eine Factory-Methode beim Erstellen einer Instanz einer anderen Klasse häufig als statisch deklariert, da dies bedeutet, dass eine bestimmte Instanz der Klasse, die die Faktor-Methode enthält, nicht erforderlich ist.

Eine gute Erklärung, wie, wann und wo, finden Sie unter MSDN

Dave Arkley
quelle
8
Nein, eine statische Klasse wird niemals instanziiert. Da alles in sie statisch ist, warum sollten Sie wollen es instanziiert?
Jon Skeet
1
Eine staticKlasse hat überhaupt keine Instanz.
SLaks
4
Sorry Leute, ich verstehe nicht ... Ich sagte, eine einzelne Instanz wird erstellt und Sie können keine neue erstellen. Sicherlich wird eine einzelne statische Instanz erstellt, sonst wäre der Code nicht aufrufbar?
Dave Arkley
2
Eine statische Klasse hat eine Instanz, tatsächlich zwei, sie sind einfach keine Instanzen des Typs. Auf dem Heap ist eine statische Klasse als Objekt vom Typ [Foo] (Nachschlagetabelle für Methoden usw. für die JIT) und als spezielles System.Type-Objekt für die Initialisierung vorhanden.
McCainz
Eine Klasse kann als statisch deklariert werden, was darauf hinweist, dass sie nur statische Elemente enthält. Es ist nicht möglich, Instanzen einer statischen Klasse mit dem neuen Schlüsselwort zu erstellen. Statische Klassen werden automatisch von der Common Language Runtime (CLR) von .NET Framework geladen, wenn das Programm oder der Namespace mit der Klasse geladen wird.
Satheesh