Static (Informatik)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

static ist ein Zusatz bei der Deklaration von Variablen in Programmiersprachen wie C, C++, Java oder C#, VB.NET.

static als Speicherklasse[Bearbeiten]

Die Speicherklasse static definiert die „Lebenszeit“ und die Bindung einer Variable – sie wird während der kompletten Laufzeit einer Übersetzungseinheit existieren bzw. den letzten zugewiesenen Wert tragen; fremde Übersetzungseinheiten sehen bei direktem Zugriff prinzipiell nur unabhängige Kopien. Soll zum Beispiel der tatsächliche, aktuelle Wert der statischen Variable A aus Übersetzungseinheit X ausgelesen werden, so muss zwangsläufig eine Funktion/Methode/Eigenschaft oder Schnittstelle aus Einheit X genutzt werden; ohne diese ist A immer eine (ggf. statisch initialisierte) Kopie für Einheit Y.

static als Typqualifikator[Bearbeiten]

In C und C++ wird durch diesen Typqualifikator spezifiziert, dass die zugewiesene Variable innerhalb dieser Klasse und Instanzen-unabhängig nur ein einziges Mal physikalisch existiert. Solche Daten sind besonders innerhalb von Multithreading-Prozessen oder bei Verwendung mehrerer Prozesse relevant, beispielsweise beim gemeinsamen Zugriff auf eindeutige Datenfelder – in einem solchen Szenario könnte ein Mutex mittels static deklariert werden und so eine Sequentialisierung der Datenzugriffe verschiedener Threads ermöglichen.

Auch als eindeutiges Datenfeld kann static dienlich sein; beispielsweise kann es unter Umständen sinnvoll sein, eine Ethernet-Datenverbindung (siehe auch Socket) derart zu deklarieren. Zugriffe auf diese Verbindung können dann über eine umgebende Klasse oder ein Modul stattfinden und z. B. zusätzliche Funktionalität zur Flusssteuerung beinhalten – ein reales Beispiel wäre eine TCP-Schnittstelle für einen RS232-Port, da der Port keine Mehrfachverbindungen erlaubt, wäre eine Mehrfachkonnektierung diverser LAN- bzw. WAN-Clients nur mit Zusatzaufwand machbar.

Beispiel in VB.NET[Bearbeiten]

In VB.NET ist eine Deklarierung als static im globalen Kontext oder auch nur außerhalb einer Funktion/Prozedur im Gegensatz zu anderen Sprachen nicht möglich[1], hierfür existiert das Schlüsselwort shared.[2]

Das folgende Beispiel zeigt eine banale Anwendung innerhalb von Threads; eine Static-Variable wird nur ein einziges Mal initialisiert, selbst dann, wenn die aktuelle Prozedur/die aktuelle Thread-Iteration bereits beendet wurde und der Logik nach ein anderer Thread nun reinitialisieren sollte:

Imports System.Threading
Public Class StaticDemo
   Private Shared ReadOnly mMutex As New Mutex                                       '1 Kopie für alle Threads
   Public Sub StartThreads()
      For i As UInteger = 1 To 10
         ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf IncrementThread))   '10 Threads starten
      Next
   End Sub
 
   Private Sub IncrementThread()
      Dim tId As Integer = Thread.CurrentThread.ManagedThreadId                      'hier kann jeder Zugriff verfolgt werden
      Static mNumber As UInteger = 0                                                 '1 Kopie für alle Threads, Kontextbeschränkt

      While mMutex.WaitOne         
         mNumber += 1
         mMutex.ReleaseMutex()
      End While
 
    End Sub
End Class

Beispiel in C[Bearbeiten]

Das folgende Beispiel zeigt die Funktionalität dieses Schlüsselwortes in C:

#include <stdio.h>
 
void func() {
        static int x = 0;  // x wird nur ein einziges Mal initialisiert, trotz der Mehrfachaufrufe in main()
        printf("%d\n", x); // gibt den Wert von x aus
        x = x + 1;
}
 
int main(int argc, char * const argv[]) {
        func();            // Ausgabe : 0
        func();            // Ausgabe : 1
        func();            // Ausgabe : 2
        return 0;
}

Beispiel in C++[Bearbeiten]

class Request
{ 
        private: 
                static int count = 0;  //Zähler für alle Aufrufe
                string url;          
 
        public: 
                Request()  { count++;  } 
                string getUrl ( )  const  {  return url;  } 
                void setUrl ( string value )  { url = value;  } 
                static int getCount()  {  return count;  }            
};

Einzelnachweise[Bearbeiten]

  1. Vorlage:Internetquelle/Wartung/Zugriffsdatum nicht im ISO-FormatStatic (Visual Basic). Microsoft, abgerufen am 28. Oktober 2012 (deutsch).
  2. Vorlage:Internetquelle/Wartung/Zugriffsdatum nicht im ISO-FormatShared (Visual Basic). Microsoft, abgerufen am 28. Oktober 2012 (deutsch).

Weblinks[Bearbeiten]