Autor Beitrag
OldCat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Do 28.10.21 13:20 
Liebe Gemeinschaft,

derzeit beschäftige ich mich mit dem Keyword 'static' und stelle fest, dass ich es nicht eindutig verstehe. Egal, welche Quelle ich in meinem Selbstudium dafür auch nutze.

Hatte ca. vorgestern auch einen Thread von 2008 hier gelesen, da ging es um dasselbe Problem. Jedoch wurde ich daraus leider auch nicht schlauer: Das große 'Aha-Erlebnis' blieb aus...
Finde diesen Thread aber auch nicht wieder (war über Google hin navigiert).

Mag einer von euch, einem Quereinsteiger und Anfänger (lerne noch Grundlagen), mal für 'Dummies' so einfach und knapp wie möglich erklären?

Wofür genau brauche ich es?

Wofür sollte ich es nicht einsetzen?

Was sind die Vor- und Nachteile?


Liebe Grüße :wink2:


Zuletzt bearbeitet von OldCat am Fr 29.10.21 12:52, insgesamt 1-mal bearbeitet
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 28.10.21 14:22 
Hast Du dich schon mit der Objektorientierung beschäftigt?
Das "static" erscheint unter Umständen ziemlich sinnlos, wenn Du die Objektorientierung nicht verstanden hast, Du solltest also lieber da anfangen ;)
Das "static" besagt aus, dass Du den Member direkt über die Klasse nutzen kannst und keine Instanz dafür brauchst -> Objektorientierung
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Do 28.10.21 16:27 
Ja, den Begriff 'Objektorientierung' habe ich schon erlernt und auch verstanden.

Ich weiß auch, dass 'static' bedeutet, dass ich für Klassen, Methoden, etc. keine Instanziierung benötige, sondern den Member direkt über die Klasse nutzen kann.
Diese Information reicht mir aber nicht aus, um den Sinn von 'static', bzw. non-static zu verstehen.

So stellte sich mir die Frage: Okay, warum dann nicht immer 'static' verwenden, statt vorher eine Klasse, etc. zu instanziieren.

Daraufhin las ich hier mal was, das ich nicht wiederfand, wo aber so in etwa folgendes gesagt wurde:
1. Das ausschließliche Nutzen vom 'static' Modifizierer würde dem Paradigma von OOP zuwider laufen.
2. Der Code wäre schlecht wartbar.
3. Der Code wäre dadurch manipulierbarer.

Daher stelle ich noch mal die Fragen, die mir hoffentlich verständlich machen, wozu 'static' gedacht ist, und wann man es nicht einsetzen sollte:

Wofür genau brauche ich es?

Wofür sollte ich es nicht einsetzen?

Was sind die Vor- und Nachteile?


Liebe Grüße :wink2:
Antworten mit Zitat
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 28.10.21 17:10 
Zitat:
Okay, warum dann nicht immer 'static' verwenden, statt vorher eine Klasse, etc. zu instanziieren.

Die Frage zeigt, dass Du die Objektorientierung eben nicht verstanden hast ;)
Im Gegenteil, normalerweise ist die Frage eher, ob man static wirklich braucht, oder ob es nicht doch besser geht.
Wenn Du das static nur als solches betrachtest, hat es keine Nachteile, aber Du verschenkst alle Vorteile der OOP.
OOP ist keine technische Geißel, die dir das Leben schwer machen soll oder irgendeinen technischen Grund hat.
OOP ist ein technisch enorm aufwändiges Konstrukt (aufwändig, weil die CPU keine Ahnung von Objekten hat), das entwickelt wurde, um viele Probleme in der Softwareentwicklung besser angehen zu können.

Zitat:
1. Das ausschließliche Nutzen vom 'static' Modifizierer würde dem Paradigma von OOP zuwider laufen.

Das als Grund ist natürlich völlig nutzlos, ohne zu erklären, warum man OOP folgen sollte.
Schau dir die Prinzipien von OOP an (z.B. Polymorphie) an und welche Vorteile sie bringen. Mit static geht das wenn nur eingeschränkt.

Zitat:
2. Der Code wäre schlecht wartbar.

Stimmt soweit, dahinter verstecken sich aber viele Gründe.
Einer der Gründe ist z.B. das Risiko von Seiteneffekten. Wenn z.B. irgendetwas einen fehlerhaften statischen Zustand hinterlässt, "leidet" alles andere darunter auch.
Eigentlich möchtest Du jedes bisschen Code möglichst unabhängig haben, weniger Abhängigkeiten nach draußen = weniger Risiken, die Fehler verursachen können.

Zitat:
3. Der Code wäre dadurch manipulierbarer.

Der Grund klingt irgendwie unsinnig. Vielleicht ist aber das gleiche gemeint, was ich vorher beschrieben habe.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 28.10.21 17:20 
Der wichtigste Satz in static (C# Referenz) ist m.E.
Zitat:
Während die Instanz einer Klasse eine separate Kopie aller Instanzfelder der Klasse enthält, gibt es nur eine Kopie von jedem static-Feld.
(Hervorhebung meinerseits).

Statische Member existieren (zur Laufzeit) nur einmalig (und sind daher wie globale Variablen zu verstehen), d.h. es ist nicht möglich mehrere verschiedene Instanzen davon zu erzeugen - und das ist genau das, was man normalerweise mittels der Objektorientierung erreichen möchte.
static (bei Feldern und Eigenschaften) sollte man also sehr sparsam und nur gezielt einsetzen.

Für diesen Beitrag haben gedankt: OldCat
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Do 28.10.21 18:17 
@Paladin007

Zitat:
Die Frage zeigt, dass Du die Objektorientierung eben nicht verstanden hast ;)
Im Gegenteil, normalerweise ist die Frage eher, ob man static wirklich braucht, oder ob es nicht doch besser geht.
Wenn Du das static nur als solches betrachtest, hat es keine Nachteile, aber Du verschenkst alle Vorteile der OOP.
OOP ist keine technische Geißel, die dir das Leben schwer machen soll oder irgendeinen technischen Grund hat.
OOP ist ein technisch enorm aufwändiges Konstrukt (aufwändig, weil die CPU keine Ahnung von Objekten hat), das entwickelt wurde, um viele Probleme in der Softwareentwicklung besser angehen zu können.


Naja, ich will jetzt mit Dir auch nicht darauf herumreiten, wie viel oder wie wenig ich von OOP verstanden habe, oder nicht. Oder ob ich möglicherweise nichts davon verstanden habe. Oder von einem Für und Wider von OOP und anderen Programmiersprachen ohne OOP mit Dir zu diskutieren. Das würde meinem aktuellen Anfänger-Horizont, bezüglich C# und Programmiersprachen allgemein, eh übersteigen. Für mich als Anfänger gibt es eh nur OOP, da ich mir noch keine Programmiersprache ohne OOP angelernt habe. Es bringt mich hier und jetzt - in meinem Anliegen - auch nicht weiter. Es wird hoffentlich der Tag kommen, da werde ich OOP in seiner Gänze erkannt haben. Und auch, was Polymorphie in OOP für eine Bedeutung hat. Und was Polymorphie in der Programmierung allgemein für eine Bedeutung hat.

Jetzt möchte ich aber erstmal nur wissen, was es mit dem Modifizierer 'static' (in C#) auf sich hat. Darüber hast Du mir bisher nichts gesagt.

Doch ich werde mich jetzt auch nochmal genauer mit dem Konzept von OOP auseinander setzen. Das ist es, was ich von unserer Konversation bezüglich des Modifizierers 'static' mit nehme ...
--------------

@ Th69

Klar, die Referenz in Microsoft Docs über 'static' habe ich schon mehrmals aufgesucht. Doch ist es nicht besonders anfängerfreundlich. Das Aha-Erlebnis blieb auch dort aus ...
Zitat:
Statische Member existieren (zur Laufzeit) nur einmalig (und sind daher wie globale Variablen zu verstehen), d.h. es ist nicht möglich mehrere verschiedene Instanzen davon zu erzeugen - und das ist genau das, was man normalerweise mittels der Objektorientierung erreichen möchte.

Das hier ist schon recht hilfreich und da habe ich auch das Gefühl, der Sache näher zu kommen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 28.10.21 20:57 
Zitat:
Klar, die Referenz in Microsoft Docs über 'static' habe ich schon mehrmals aufgesucht. Doch ist es nicht besonders anfängerfreundlich. Das Aha-Erlebnis blieb auch dort aus ...

Das ist eins der vielen Dinge die man theoretisch auch eher nicht verstehen kann. Genauso wenig wie man das Schreinern verstehen kann wenn man sich nur die Werkzeuge eines Tischlers ansieht und die Beschreibung auf der Verpackung die man im Bauhaus mitgenommen hat aber nicht mal versucht ein Schrank, Tisch, Stuhl zu bauen. Der Aha Effekt kommt beim bauen insbesondere wie die funktionweise verschiedenener Werkzeuge ineinander greifen. Ohne Werkzeug Nagel wird es schwierig das Werkzeug Hammer zu verstehen ;)

Und für einen Programmierer ist 'static' eins der vielen Werkzeuge im Werkzeugkasten. Erfahrene Programmierer werden dir sagen das 'static' ein Problem ist und du wenn möglich andere Wege gehen solltest genauso übrigens bei vielen anderen Möglichkeiten der Sprache. Das bestimmte Dinge aber als problematisch gelten hat viel mit Skaleneffekten zu tun. Was bei einem 100 Zeilen Programm noch völlig egal ist wie du es löst und bei einem vielleicht 10.000 Zeilen Programm eine pragmatische einfache (und daher zu präferierende) Lösung ist (wie vieles das man mit 'static' anstellen kann) ist dann in noch größerer Software ein Riesenproblem.

Um das mit Skaleneffekt zu verstehen muss man es aber mal gemacht haben (aka damit Erfahrung gesammelt haben). Also einfach 'static' hinnehmen, irgendwo im Hinterkopf merken das es da was gibt von dem man aber noch nicht weiß wofür es gut sein könnte und dann beim coden irgendwann merken "boah hier würde sich doch dieses ... wie hieß es doch nochmal .... static anbieten".

Solltest du irgendwo Beispiele mit 'static' sehen sei dir bewusst es ist nur ein Beispiel es soll dir die technische Funktionsweise dieses Sprachfeatures auf möglichst kompakte Art zeigen. Es ist aber mit fast 100%er Wahrscheinlichkeit nicht wie man es in einer echten Applikation benutzen sollte ;) Traurig aber leider wahr und wohl auch nicht anders machbar. Die Benutzbarkeit ergibt sich erst in Zusammenspiel mit anderen Dingen und das würde den Rahmen eines Beispiels sprengen.

Beispiele für Anwendungen von static die ich selbst noch verwende auch in großen Applikationen.
- bei Extensionmethods, die müssen static sein
- als 'const' Ersatz zusammen mit 'readonly'

Für diesen Beitrag haben gedankt: OldCat
OldCat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77

Win 10 Pro x64
C# (VS 2019), (VS 2022)
BeitragVerfasst: Fr 29.10.21 12:51 
Lieber Ralf,

ich danke Dir von Herzen für Deine geduldige und bildliche Veranschaulichung :les: Es hat mir wieder einmal weiter geholfen. Meine Programme sind alle noch mehr oder weniger tutorialbasiert und bestehen nur aus wenigen Klassen mit ca. 300 Zeilen Code (Console-Games).

Ich werde es auch so machen, wie Du vorgeschlagen hast: Mich nicht all zu sehr daran festbeißen, es im Hinterkopf behalten und mit der Zeit, wird die Praxis Licht ins Dunkel bringen :)

Ich danke Dir für Deinen Beitrag.

Liebe Grüße
:wink2: