Laden...

Unterschied zwischen "new MyClass()" und "private static MyClass ..."

Erstellt von r1g vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.113 Views
R
r1g Themenstarter:in
4 Beiträge seit 2017
vor 7 Jahren
Unterschied zwischen "new MyClass()" und "private static MyClass ..."

Guten Tag Zusammen,

um ein Objekt einer Klasse zu erzeugen, habe ich es immer wie folgende Instantiiert:

SerialPort port = new SerialPort();

nun versuche ich ein Skript zu verstehen in dem der Serialport wie folgend benutzt wird:

Private static SerialPort serialport;

ich verstehe den unterschied zwischen den beiden Vorgehensweisen nicht und bin auch im Internet nicht fündig geworden.

Kann mir hier jemand helfen, wäre total nett!

Gruß,
Tom

D
500 Beiträge seit 2007
vor 7 Jahren

Moin,

Dein erstes Beispiel erzeugt erst einmal eine Instanz der SerialPort Klasse, wie Du bereits gesagt hast. Auf diese Art und Weise kannst Du bspw. eine lokale Variable in einer Methode erzeugen.

Die zweite Variante definiert zum einen die Sichtbarkeit "private" der Variable serialPort, und ist nur innerhalb einer Klasse sichtbar. Static bedeutet wiederum, dass jede neue Instanzen der umschliessenden Klasse Zugriff auf dieselbe Kopie der SerialPort Instanz hat. Die Variable serialPort ist Instanz uebergreifend gueltig/verfuegbar.

Gruss,
Moe

3.003 Beiträge seit 2006
vor 7 Jahren

Außerdem:

Codezeile eins besteht aus Deklaration ("es gibt eine Variable port vom Typ SerialPort") und Instanziierung ("erstelle eine neue Instanz der Klasse Serialport").

Codezeile zwei besteht nur aus der Deklaration, dh die deklarierte Variable ist noch null.

Zudem könnte es sich bei Codezeile eins um eine lokale Variable (deklariert, instanziiert und verfügbar nur innerhalb einer Methode) oder um eine Instanzvariable (deklariert, instanziiert und verfügbar innerhalb einer Instanz einer Klasse) handeln, das wird nicht komplett klar.

Wenn "Private" in Codezeile 2 richtig geschrieben wäre (nämlich klein), würde es sich definitiv um eine Instanzvariable handeln. Der Begriff "statíc" modifiziert diese Instanzvariable so, dass sie zu einer statischen Variable wird, auf die man über den Klassennamen zugreifen kann, ohne eine Instanz zu haben (und die, wie DaMoe80 schreibt, unabhängig von irgendwelchen erzeugten Instanzen immer denselben Inhalt hat.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

zum besseren Verständis am besten die Doku bemühen: C# Keywords

Von dort aus kommst Du auch auf ausführlichere Erklärungen zu den Schlüsselwörtern.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

R
r1g Themenstarter:in
4 Beiträge seit 2017
vor 7 Jahren

danke, für die netten Antworten, aber leider hab ich es immer noch nicht ganz verstanden.

Codezeile zwei besteht nur aus der Deklaration, dh die deklarierte Variable ist noch null.

mhh... was genau bedeutet null. Ich könnte doch nun über die Variable auf die Eigenschaften der Klasse zugreifen. z.b

serialport.PortName="Com1";

Zudem könnte es sich bei Codezeile eins um eine lokale Variable (deklariert, instanziiert und verfügbar nur innerhalb einer Methode) oder um eine Instanzvariable (deklariert, instanziiert und verfügbar innerhalb einer Instanz einer Klasse) handeln, das wird nicht komplett klar.

Der Deklarierte Code befindet sich direkt in der Main Funktion und nicht in einer Klasse die zuvor Instantiiert wurde. Dh es handelt sich um eine lokale Variable oder?

Aber das mit dem static habe ich immer noch nicht ganz verstanden:

wenn ich eine eigene Klasse anlege und diese als Static definiere, muss (bzw. kann) ich die Klasse nicht Instaniieren und die Eigenschaften und Methoden der jeweiligen Klasse zu benutzen.

Wenn ich innerhalb einer Klasse eine Variable als static Deklariere und mehrere Instanzen dieser Klasse erzeuge, ist für alle Klassen diese Variable gleich und ich greife über den Klassenname.Variablename auf diese zu.

aber was genau erzeugt jetzt der zweite Befehl?

ich erzeuge ja kein neues Objekt der Klasse Serialport Kann aber wie beim Instaniieren einer Klasse über den Objektnamen auf den Inhalt zugreifen.

Bei einer Static Klasse greife ich über den Klassennamen auf die Eigenschfaten und Methoden der Klasse zu, aber auch das trifft hier nicht zu

private static SerialPort xxx;
xxx.PortName="COM1";
SerialPort xxx = new SerialPort(); 
xxx.PortName="COM1";

wäre super nett, wenn mir hier nochmal jemand helfen könnte.

Gruß,

Tom

D
985 Beiträge seit 2014
vor 7 Jahren

Das mit dem Helfen wäre wesentlich einfacher wenn du den gesamten Code zeigen würdest.

Einfach hingeworfene Codezeilen führen (wie man hier sieht) zu Missverständnissen. Es kommt eben nicht nur darauf an was da steht, sondern auch wo es steht.

R
r1g Themenstarter:in
4 Beiträge seit 2017
vor 7 Jahren

Guten Abend Sir Rufo,

der komplette Code besteht aus 40 Seiten und diesen dar ich hier nicht Posten, bzw wäre das zu viel des guten.

Bin ich nun so am Thema vorbei,dass man nicht mehr versteht, was ich möchte?

Ich möchte die Klasse SerialPort verwenden und habe hier zwei Möglichkeiten dargestellt, aber verstehe nicht was der unterschied zwischen den beiden Methoden ist.

Gruß,

Tom

16.806 Beiträge seit 2008
vor 7 Jahren

Nimms mir nicht böse, aber das sind wirklich absolute Basics.
Wenn man diesen Unterschied nicht kennt, dann wird das Programmieren mit OOP sehr sehr schwer.... bis fast unmöglich.

Was static macht, haben die anderen sowohl erklärt wie auch auf die Dokumentation verwiesen.

SerialPort port = new SerialPort();

erzeugt eine Instanz von SerialPort. Der Zugriff erfolgt über die einfache Variable "port".
Diese kann nur im Scope, zB. einer Methode verwendet werden.

private static SerialPort xxx;
xxx.PortName="COM1";

wird eine NullReferenceException werfen.
Hier existiert die Klassenvariable "xxx" von der aus von einem hier nicht ersichtlichen Kontext zugegriffen wird.

Basics schön und gut, aber einen gewissen Grundsatz musst Du Dir einfach auch mal durch das Lesen eines simplen Kapitels durchlesen.
Das hier ist jedenfalls Stoff, das in der IT-Berufsschule in den ersten beiden Stunden behandelt wird.

5.657 Beiträge seit 2006
vor 7 Jahren

Hi r1g,

das sind wirklich absolute Basics

...und dir diese Basics zu erarbeiten, ist nicht die Aufgabe des Forums, siehe auch [Hinweis] Wie poste ich richtig?.

Hier ist eine Liste mit hilfreichen Links für den Einstieg: [FAQ] Wie finde ich den Einstieg in C#?
Und nochmal: C# Keywords

Den Unterschied zwischen einer statischen und einer Instanzenvariable kannst du auch bei Wikipedia nachlesen.

Weeks of programming can save you hours of planning

R
r1g Themenstarter:in
4 Beiträge seit 2017
vor 7 Jahren

Ich habe mir die Dokumentation durchgelesen

https://msdn.microsoft.com/de-de/library/98f28cdx.aspx

konnte mir für den Fall:

private static SerialPort xxx;

nicht erklären was dort genau gemacht wird.

den letzten Satz hätte man sich vielleicht trotzdem sparen können. Ich bin schon sehr verzweifelt und alleine mit der mir anvertrauten Aufgabe und kann kaum schlafen, weil ich mit der Masse von neuen Aufgaben überfordert bin.

Ich verstehe euch und werde mich nun zurückziehen und erstmal einen klaren Kopf bekommen, danke nochmal

16.806 Beiträge seit 2008
vor 7 Jahren
private static SerialPort xxx;

Ist eine statische Klassen-Variable (auch Klassenemember genannt). Hier ist der Variablen-Inhalt für ++alle ++Instanzen gleich.
Alle Instanzen greifen auf die gleiche Speicheradresse zu.

Es kann auch darauf zugegriffen werden, wenn keine Instanz der Variable existiert.

private SerialPort xxx;

Ist eine Klassen-Variable. Hier ist der Variablen-Inhalt für ++alle ++Instanzen unterschiedlich.
Jede Instanz hat seine eigene Speicheradresse.
Es kann nur darauf zugegriffen werden, wenn eine Instanz der Klasse existiert.

Mehr kann man dazu eigentlich kaum noch sagen
Statische Klassen und statische Klassenmember (C#-Programmierhandbuch)

Beide verfolgen einen unterschiedlichen Zweck.
Rest bitte durch entsprechende Basic Lektüren einfach mal selbst ausprobieren.

3.170 Beiträge seit 2006
vor 7 Jahren

Hallo,

Es kann auch darauf zugegriffen werden, wenn keine Instanz der Variable existiert. Das ist jetzt aber etwas missverständlich ausgedrückt.

Es kann auf die static Variable zugegriffen werden, ohne eine Instanz der Klasse zu erzeugen, in der sie deklariert wurde.
Eine Instanz des SerialPort braucht man aber natürlich trotzdem, und diese muss auch irgendwann mit new erzeugt und der Variablen zugewiesen werden.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

16.806 Beiträge seit 2008
vor 7 Jahren

Joa, hast recht - war unglücklich ausgedrückt.

P
1.090 Beiträge seit 2011
vor 7 Jahren

Mit den static -Modifizierer sollte man vorsichtig umgehen, da kann es schnell Seiteneffekte geben. Also ihn besser nur verwenden wenn es wirklich nötig ist. (Da es sich hier um den Zugriff auf einen COM-Port handelt kann es hier aber durchaus nötig sein.

Ich bin schon sehr verzweifelt und alleine mit der mir anvertrauten Aufgabe und kann kaum schlafen, weil ich mit der Masse von neuen Aufgaben überfordert bin.
l

Das klingt nicht gut. Wenn du schlecht schläfst, bis du am nächsten Tag Müde, lernst schlechter und machst mehr Fehler. Was dein Problem , dann noch vergrößert.
Ich weiß jetzt nicht von wem du die Aufgaben bekommen hast. Wenn es da Probleme gibt, solltest du es vielleicht möglichst Frühzeitig kommunizieren.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern