Autor Beitrag
Dingo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 12:31 
Grüße!

Ich muss euch mal wieder mit einer Verständnissfarge behelligen. Gerade bin ich bei Strukturen angekommen. Bisher so weit verstanden, struct wäre demnach fast das selbe wie class. Strukturen haben Eigenschaften, Methoden, Operatoren und Konstruktors. Jedoch mit einigen Einschränkungen, dass Strukturen keine parameterlosen Konstruktoren haben dürfen, Strukturen nicht vererbt werden dürfen und Klassen/ Strukturen dürfen nicht von anderen Strukturen abgeleitet werden. Wichtigster Unterschied, es kann, muss aber kein Objekt von Struktur erzeugt werden, um auf die Strukturdefinition und die Methoden zuzugreifen.

So weit so gut. Nun hab ich hier in meinem schlauen Buch ein Beispiel:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lektion4
{
    struct Position{

        public int x, y, h;

        public Position(int x, int y, int h){
            this.x = x;
            this.y = y;
            this.h = h;
        }

        public void PositionÄndern(int deltaX, int deltaY, int deltaH){
            x = x + deltaX;
            y = y + deltaY;
            h = h + deltaH;
        }

    }

    // Die Basisklasse für die Flugzeuge, auch generelle Klasse genannt
    class Luftfahrzeug{

        // Variablendeklaration
        public string kennung;
        protected Position pos;

        // Konstruktormethode 1, OHNE Parameter:
        public Luftfahrzeug(){
        }

        // Konstruktormethode 2, MIT Parameter:
        public Luftfahrzeug(string kennung, Position pos){
            this.kennung = kennung;
            this.pos = pos;
        }

        // Methodendeklaration
        public void Steigen(int meter){
            pos.PositionÄndern(00, meter);
            Console.WriteLine(kennung + " steigt " + meter + " Meter, neue Höhe= " + pos.h);
            Console.ReadLine();
        }

        public void Sinken(int meter){
            pos.PositionÄndern(00, -meter);
            Console.WriteLine(kennung + " steigt " + meter + " Meter, neue Höhe= " + pos.h);
            Console.ReadLine();
        }

    }

    // Flugzeug, eine Unter-Klasse von Luftfahrzeuge
    class Flugzeug : Luftfahrzeug{

        // Konstruktormethode OHNEParameter
        public Flugzeug(){
        }

        // Konstruktormethode MIT Parameter
        public Flugzeug(string kennung, Position pos) : base(kennung, pos){
        }
    }

    class Starrflügelflugzeuge : Flugzeug{

        // Konstruktormethode
        public Starrflügelflugzeuge(string kennung, Position pos) : base(kennung, pos){
        }

    }

    class Düsenflugzeug : Flugzeug{

        // Konstruktormethode
        public Düsenflugzeug(string kennung, Position pos) : base(kennung, pos){
        }

    }

    class Program
    {
        static void Main(string[] args){
            //Position pos;
            //pos.x = 105020;
            //pos.y = 30800;
            //pos.h = 110;
            //Console.WriteLine("Strukturwert: x= " + pos.x + ", y= " + pos.y + ", h= " + pos.h);

            /* Einzelinitialisierung der drei Felder. 
            Im ersten Fall kann nur das deklarierte Strukturobjekt beim erzeugen eines
            neuen Objektes vom Typ irgendeiner Fliegerklassen verwendet werden. */

            Position pos1;
            pos1.x = 105020;
            pos1.y = 30800;
            pos1.h = 110;
            Luftfahrzeug flieger1 = new Luftfahrzeug("LH 4080", pos1);
            flieger1.Steigen(100);
            flieger1.Sinken(50);

            /* Initialisierung der frei Felder mit einem Konstruktor.
            Im zweiten Fall kann das mit "new" und Konstruktor initialisierte Strukturobjekt beim erzeugen eines
            neuen Objektes vom Typ irgendeiner unserer Fliegerklassen verwendet werden. */

            Position pos2 = new Position(5020800500);
            Düsenflugzeug flieger2 = new Düsenflugzeug("LH 334", pos2);

            // Alternative Schreibweise der oberen beiden Zeilen: 
            // Düsenflugzeug flieger2 = new Düsenflugzeug("LH 334", new Position(5020, 800, 500));

            Console.WriteLine("Position flieger1: x= " + pos1.x + ", y= " + pos1.y + ", h= " + pos1.h);
            Console.WriteLine("Position flieger2: x= " + pos2.x + ", y= " + pos2.y + ", h= " + pos2.h);
            Console.ReadLine();
        }
    }
}


Gerade das hier verstehe ich nicht daran:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
            /* Einzelinitialisierung der drei Felder. 
            Im ersten Fall kann nur das deklarierte Strukturobjekt beim erzeugen eines
            neuen Objektes vom Typ irgendeiner Fliegerklassen verwendet werden. */

            Position pos1;
            pos1.x = 105020;
            pos1.y = 30800;
            pos1.h = 110;
            Luftfahrzeug flieger1 = new Luftfahrzeug("LH 4080", pos1);
            flieger1.Steigen(100);
            flieger1.Sinken(50);

            /* Initialisierung der frei Felder mit einem Konstruktor.
            Im zweiten Fall kann das mit "new" und Konstruktor initialisierte Strukturobjekt beim erzeugen eines
            neuen Objektes vom Typ irgendeiner unserer Fliegerklassen verwendet werden. */

            Position pos2 = new Position(5020800500);
            Düsenflugzeug flieger2 = new Düsenflugzeug("LH 334", pos2);


Dazu hier der schöne Schachtelsatz, den ich nicht verstehe: Im ersten Fall kann des lediglich deklarierte, im zweiten das mit "new" und Konstruktor initialisierte Strukturobjekt beim Erzeugen eines neuen Objektes vom Typ eirgendeiner unserer Fliegerklassen verwendet werden.

Wo ist da jetzt der Unterschied? pos1 ist eine Objektvariable von der Struktur Position. pos2 wäre ebenfalls eine Objektvariable, diese wurde jedoch initialisiert durch den new Konstruktor. Bedeutet nun der Unterschied auf pos2 kann ich einmal wieder zugreifen, auf pos1 nicht?

Des weiteren, wann setze ich struct ein. Wie ich gelesen habe, eigentlich nur bei Kleinigkeiten.

Zudem der prinzimielle Unterschied zwischen strukt und class ist, dass class ein Refferenztyp ist und struct ein Wertetyp.


Zur Beschreibung:

Ein Typ ist ein Wertetyp, wenn die Stelle im Arbeitsspeicher, die für die Variable vorgesehen ist, auch den Wert enthält. Der Speicher weiß, es ist ein Integer Wert und dieser ändert sich auch nicht mehr.

Adernfalls ist ein Typ ein Referenztyp. Die Stelle im Arbeitsspeicher, die für die Variable vorgesehen ist, enthält nicht den eigentlichen Inhalt/Wert, sondern "nur" einen Verweis auf die Stelle im Arbeitsspeicher, wo sich die tatsächlichen Daten befinden. Also der Speicher weiß nur, ich muss Platz für einen Integer bereit halten.

Was wäre hierzu ein Beispiel, so richtig kann ich es nicht aus dem Quellcode herauslesen.

Des weiteren:

ausblenden C#-Quelltext
1:
Düsenflugzeug flieger3 = new Düsenflugzeug("LH 334"new Position(5020800500));					

Was macht diese Zeile für einen Sinn?
Ich gebe zwar die Zahlen an Position bzw. deren Konstruktor weiter weiter, diese werden auch in x, y und h gespeichert, jedoch kann ich diese doch nie wieder aurufen. Warum sollte ich also dies ohne ein Objekt machen?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4431
Erhaltene Danke: 906


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 13.03.17 13:35 
Zitat:
Wo ist da jetzt der Unterschied? pos1 ist eine Objektvariable von der Struktur Position. pos2 wäre ebenfalls eine Objektvariable, diese wurde jedoch initialisiert durch den new Konstruktor. Bedeutet nun der Unterschied auf pos2 kann ich einmal wieder zugreifen, auf pos1 nicht?

Keine Ahnung worauf der Author hier ansprechen will. Nachdem erzeugen eines Structs oder Klasse weiß dieses Object nicht mehr wie es erzeugt wurde. Man müßte schon selbst irgendwas programmieren das das nachhält. Heißt nach dem zuweisen der Felder oder nach dem Aufruf des Konstruktor verhalten sich die beiden Instanzen des Structs gleich egal wie sie entstanden sind.
Zitat:
Des weiteren, wann setze ich struct ein. Wie ich gelesen habe, eigentlich nur bei Kleinigkeiten.

Zudem der prinzimielle Unterschied zwischen strukt und class ist, dass class ein Refferenztyp ist und struct eun Wertetyp.

Ein Typ ist ein Wertetyp, wenn die Stelle im Arbeitsspeicher, die für die Variable vorgesehen ist, auch den Wert enthält.

Man braucht structs nur ganz selten. In vielen Sprachen sind structs so eine Art lightweight Variante von Klassen oder gleich was ganz anderes. In .Net sind sie nahezu das Gleiche mit dem kleinen (aber wichtigen) Unterschied was bei Zuweisungen passiert. Das geht in der Beschreibung meist unter wenn man von Referenztyp oder Valuetyp spricht. Bei Klassen werden bei Zuweisungen eine weitere Referenz auf das gleiche Object erstellt. Bei structs wird bei Zuweisung eine unabhängige Kopie erstellt. Der angesprochene prinzipielle Unterschied ist ein Implementierungsdetail der Sprache. Es gibt keinen Grund warum das so sein muß um den Verhaltensunterschied von struct/class zu erklären (Wenn du lustig bist kannst du dir das Thema Boxing/Unboxing mal ergooglen). Wenn du dir unsicher bist was du nehmen solltest solltest du erstmal einfach immer eine class nehmen.
Ich will nur ein Best Practise nennen im Zusammenhang mit structs. Structs sollen so geschrieben sein das sie sich nach dem Erzeugen nicht mehr ändern (Im Programmierer Jargon spricht man von "sollte immutable sein"). Wenn du ein Ding brauchst dessen Inhalt sich zur Laufzeit ändert/ändern kann dann bist du mit fast 100% Wahrscheinlichkeit bei einem struct falsch. Einer der Grnde ist das man sich beim Kopierverhalten von structs sehr leicht reinlegen kann und glaubt Instanzen des structs zu ändern während man längst an einer Kopie des structs hängt und diese Änderung dann ins Leere läuft.

Dingo hat folgendes geschrieben:
Was macht diese Zeile für einen Sinn?
Ich gebe zwar die Zahlen an Position bzw. deren Konstruktor weiter weiter, diese werden auch in x, y und h gespeichert, jedoch kann ich diese doch nie wieder aurufen. Warum sollte ich also dies ohne ein Objekt machen?


Die flieger3 kennt diese Position Instanz und kann die nutzen. Wenn niemand anderes diese Instanz braucht ist es völlig ok da keine, ansonsten unbenutzte, Variable zu erfinden die auf diesen struct verweist.

Moderiert von user profile iconTh69: C#- durch Quote-Tags ersetzt

Für diesen Beitrag haben gedankt: Dingo
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 13:57 
- Nachträglich durch die Entwickler-Ecke gelöscht -


Zuletzt bearbeitet von Frühlingsrolle am Mo 13.03.17 15:05, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Dingo
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 14:07 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Position pos1;
pos1.x = 105020;
pos1.y = 30800;
pos1.h = 110;
Luftfahrzeug flieger1 = new Luftfahrzeug("LH 4080", pos1);
flieger1.Steigen(100);
flieger1.Sinken(50);

/* Initialisierung der frei Felder mit einem Konstruktor. */
Position pos2 = new Position(5020800500);
Düsenflugzeug flieger2 = new Düsenflugzeug("LH 334", pos2);


Das was der Autor da schrieb hat mich auch etwas verwirrt, drum noch mal zum mitschreiben. pos1 ist ja eine Objektvariable, genau so wie pos2. Jedoch kann ich unten in der Console.WriteLine sowohl auf pos1 und pos2 zugreifen, obwohl ich doch kein Objekt durch die Konstruktormethode erstellt habe. Ist pos1 nun auch ein Objekt, wenn ja, warum wurde es nicht druch eine "new" Konstruktormethode initialisiert?

Zu Werte- und Verweistypen, ja das geht da etwas unter.

Also ein Wertetyp wäre ein Typ, deen Speicherbereich bekannt ist. Ihm kann ein fest reservierter Speicher (Stack-Bereich) zugeteilt werden. Bei Integer also 32 Bit, egal ob der Wert 58 oder 554234 ist. Wenn die Struktur einer neuen Variable zugewiesen wird, werden diese kopiert. Die neue Variable und die ursprüngliche Variable enthalten daher zwei separate Kopien der gleichen Daten. Änderungen an einer Kopie wirken sich nicht auf die andere Kopie aus.

Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
int a = 123
int b = a;
a = 0;


a wäre im Beispiel nun 0 und b hätte immer noch den Wert 123.

Ein Verweistyp hingegen hat keinen festen Speicherbereich und wird in einem anderen Speicherbereich untergebracht (Heap- Bereich). Zm zweiten Wenn ein Objekt einer Klasse erstekkt wird, enthällt es ja Variablen, die dem Objekt zugewiesen sind. Wenn ein Objektverweis einer neuen Variable zugewiesen wird, verweist die neue Variable auch auf das ursprüngliche Objekt.

Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
Klasse a = new Klasse(123);
Klasse b = a;
a.value = 0;

Demnach würden sowohl a als auch b den Wert 0 haben, da b keine Kopie von a ist, sondern nur ein vereis auf a.

Hab ich das richtig verstanden?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Zuletzt bearbeitet von Dingo am Mo 13.03.17 14:24, insgesamt 1-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4050
Erhaltene Danke: 838

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Mo 13.03.17 14:10 
Auch hier geht es wieder um den Standard-Konstruktor, d.h. bei reiner Angabe von
ausblenden C#-Quelltext
1:
Position pos1;					
wird dieser implizit aufgerufen, d.h. entspricht also
ausblenden C#-Quelltext
1:
Position pos1 = new Position();					

(daher darf und kann dieser auch nicht bei Strukturen überschrieben werden, damit das Verhalten immer gleich ist, d.h. alle Member werden standard-initialisiert).

Und ja, du hast den Unterschied von Wert- und Verweistyp richtig beschrieben und verstanden.

PS: @Frühlingsrolle: Kann es sein, daß du teilweise mit C# und Java durcheinander gekommen bist?
ausblenden Quelltext
1:
2:
'Position' does not contain a constructor that takes 2 arguments
'Position' does not contain a constructor that takes 3 arguments
(wenn ich WriteLn durch WriteLine ersetze) :D


Zuletzt bearbeitet von Th69 am Mo 13.03.17 14:25, insgesamt 4-mal bearbeitet

Für diesen Beitrag haben gedankt: Dingo
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 14:18 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Auch hier geht es wieder um den Standard-Konstruktor, d.h. bei reiner Angabe von
ausblenden C#-Quelltext
1:
Position pos1;					
wird dieser implizit aufgerufen, d.h. entspricht also
ausblenden C#-Quelltext
1:
Position pos1 = new Position();					

(daher darf und kann dieser auch nicht bei Strukturen überschrieben werden, damit das Verhalten immer gleich ist, d.h. alle Member werden standard-initialisiert).


Ah, verstehe, dann ist das ja klar, dachte schon hier wird ohne new gearbeitet!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 14:23 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4050
Erhaltene Danke: 838

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Mo 13.03.17 14:27 
Der C#-Compiler erzeugt aber keinen Fehler bei
ausblenden C#-Quelltext
1:
Console.WriteLine(p1.h);					

Ups: Du hast doch recht, ich hatte noch explizit
ausblenden C#-Quelltext
1:
Position pos = new Position();					
in meinem Test stehen.

Dann gibt es doch einen Unterschied zwischen diesen beiden Codezeilen (das war mir bisher nicht bewußt).

PS: Ich hatte gerade meinen Beitrag oben noch nacheditiert.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 14:36 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 16:51 
Könnte mir noch wer sagen, ob das nun so stimmt.^^

Ein Wertetyp ist ein Typ, deren Speicherbereich bekannt ist. Ihm kann ein fest reservierter Speicher (Stack-Bereich) zugeteilt werden. Bei Integer also 32 Bit, egal ob der Wert 58 oder 554234 ist. Wenn die Struktur einer neuen Variable zugewiesen wird, werden diese kopiert. Die neue Variable und die ursprüngliche Variable enthalten daher zwei separate Kopien der gleichen Daten. Änderungen an einer Kopie wirken sich nicht auf die andere Kopie aus.

z.B.:
ausblenden C#-Quelltext
1:
2:
3:
int a = 123
int b = a;
a = 0;


a wäre im Beispiel nun 0 und b hätte immer noch den Wert 123.

Ein Verweistyp hingegen hat keinen festen Speicherbereich und wird in einem anderen Speicherbereich untergebracht (Heap- Bereich).Wenn ein Objekt einer Klasse dupliziert erstellt wird, enthällt es Variablen, die dem neuen Objekt zugewiesen sind. Wenn nun eine Variable in einem Objekt verändetr wird, wird, wird die Variable auch im anderen Objekt geändert.

z.B.:
ausblenden C#-Quelltext
1:
2:
3:
Klasse a = new Klasse(123);
Klasse b = a;
a.value = 0;


Demnach würden sowohl a als auch b den Wert 0 haben, da b keine Kopie von a ist, sondern nur ein Vereis auf a.


Jedoch, wie sieht es bei bei Strukturen und Klassen aus. Warum ist eine Klasse Vereistypen und eine Strukturen ein Wertetyp? So richtig sehe ich den Zusammenhang nicht verstanden.

Die Klasse liefert ja nur die Beschreibung des Objektes. Jedoch kann ich unterschiedlich viele Autos aus der Klasse Fahrzeuge machen. Jede Variable zu jedem Objekt wäre ja mit unterschiedlichen Werten gefüllt. Ein Verweis wäre es ja erst, wenn ich eben das schreibe:

Klasse b = a;

Damit erzeuge ich ja einen Verweis, verändere ich a, ändert sich auch b und umgekehrt.

Wie ist das nun bei Objekten von Strukt?

Klasse b = a;

Wenn ich es richtig verstanden habe, wird nun nicht ein Verweis erstellt, sondern eine Kopie?
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 17:44 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 17:56 
Hab ich schon mehrfach, beantwortet mir aber leider nicht meine Fragen. :(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4431
Erhaltene Danke: 906


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 13.03.17 18:02 
Zitat:
Ein Wertetyp ist ein Typ, deren Speicherbereich bekannt ist. Ihm kann ein fest reservierter Speicher (Stack-Bereich) zugeteilt werden.


Das ist ein unwichtiges Implementierungsdetail. Nichts was man berücksichtigen sollte wenn man programmiert (erstmal, ganz lange erstmal ;) ). Wo ein Objekt erzeugt wird kann sich mit jeder Framework Version ändern ohne das sich das grundsätzliche Verhalten ändert. Nebenbei wäre auf dem Stack richtiger und manchmal dann doch auf dem Heap (Stichwort Boxing/Unboxing).

Zitat:
Wenn die Struktur einer neuen Variable zugewiesen wird, werden diese kopiert. Die neue Variable und die ursprüngliche Variable enthalten daher zwei separate Kopien der gleichen Daten. Änderungen an einer Kopie wirken sich nicht auf die andere Kopie aus.


Ja. Mit der Ergänzung das da nicht unbedingt eine neue Variable beteiligt sein muß. Bei der Übergabe/Rückgabe an/aus eine(r) Methode wird ebenfalls kopiert.

Zitat:
Demnach würden sowohl a als auch b den Wert 0 haben, da b keine Kopie von a ist, sondern nur ein Vereis auf a.


Richtig

Zitat:
Jedoch, wie sieht es bei bei Strukturen und Klassen aus. Warum ist eine Klasse Vereistypen und eine Strukturen ein Wertetyp? So richtig sehe ich den Zusammenhang nicht verstanden.


Welchen Zusammenhang? Klasse, structs, Verweistypen, Wertetypen sind nur Namen für ein bestimmtes Verhalten. Das Verhalten solltest du unterscheiden lernen. Aber warum die Dinger so heißen ist fast nebensächlich. Das es manchmal diesen Unterschied braucht hast du ja an deinem eigenen Beispiel mit Integern gezeigt. Das sich Integer wie ein Wertetyp verhält sollte sich für dich auch ganz natürlich anfühlen. Das es eine komplexe Klasse nicht tut und sich wie ein Referenztyp verhält auch. Stell dir vor deine Flugzeuge wären structs und du würdest mehrere Flugzeuge in einer Listen verwalten (Für z.B. einen Tracker der die Positionen auf einer Karte anzeigt). Du hättest erhebliche Probleme ein Flugzeug aus der Liste zu holen und deren Position zu verändern so das die Änderung der Position auch wirklich das Flugzeug in der Liste betrifft und nicht nur eine Kopie die du absichtlich oder aus versehen auf dem Weg erstellt hast. Bedenke die Liste hätte eine Referenz auf das Objekt und eine andere Variable über die du das Objekt bearbeitest auch. Viele Referenzen auf das gleiche Objekt zu haben ist was ganz übliches. In simplen Beispielen sieht es meist oft nur anders aus.

Vielleicht ist das ein Beispiel das du mal probieren solltest. Versuche 3 oder 4 Flugzeuge in einer List<Flugzeuge> zu verwalten und die Position der Flugzeuge in der Liste zu ändern. Wenn du das mal mit struct Flugzeugen und mal mit class Flugzeugen machst fällt dir der Unterschied vielleicht deutlicher auf.



Zitat:
Wenn ich es richtig verstanden habe, wird nun nicht ein Verweis erstellt, sondern eine Kopie?


Richtig


Zuletzt bearbeitet von Ralf Jansen am Mo 13.03.17 21:54, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Dingo
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 18:35 
Also wäre Strukt eine einfache Form von der Klasse und der Hauptunterschied ist, das Objekte bei Klassen vewrweise sind und Objekte bei Srtrukturen Kopien. Bitte sag mir, dass ichs dieses mal richtig verstanden habe! :lol:
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 18:50 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Dingo
Dingo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 64
Erhaltene Danke: 1



BeitragVerfasst: Mo 13.03.17 19:12 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Bei Klassen werden bei Zuweisungen eine weitere Referenz auf das gleiche Object erstellt. Bei structs wird bei Zuweisung eine unabhängige Kopie erstellt.

Ich glaub ich brauch mal wieder Urlaub... :roll: