Entwickler-Ecke
WinForms - Unterschied von Klasse und Struktur
SharinganShuriken - Mi 03.07.13 00:23
Titel: Unterschied von Klasse und Struktur
Hallo liebe Community,
ich hoffe der Betreff ist richtig formuliert.
Wenn ich einer Klasse z.b eine Form1 im Standardkonstruktor mitgebe kann ich mit diesem Objekt im nachhinein, Größe, Text, usw. verändern aber wenn ich das ganze mit einer Struct mache geht dies nicht :(
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:
| public struct desc { public string name; public desc(string name) { this.name = name; } }
desc l = new desc("");
private void button1_Click(object sender, EventArgs e) { Class1 c = new Class1(l);
this.Text = l.name; } }
public class Class1 { public Class1(Form1.desc f) { f = new Form1.desc("lol"); } } |
name ist immer "" :(
Dies ist nur ein kleines Beispiel, eigentlich wollte ich in ein Tag Object reinschreiben und die Quelle vom Tag Object zu einem späteren Zeitpunkt verändern aber wie gesagt es geht nicht und jetzt ist meine Frage, wieso geht es bei einer Form1 aber bei allen anderen Sachen nicht ?
Alles Liebe
SharinganShuriken
jfheins - Mi 03.07.13 08:47
Referenz vs. Wertetypen zu verstehen kann natürlich nicht schaden, trifft aber nicht den Kern des Problems.
Sobald man nämlich einen übergebenen Parameter mit new neu belegt, erzeugt man ja ein neues Objekt/struct. Das Verhalten ist bei Objekten und structs eigentlich identisch.
Siehe auch der Code hier:
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:
| using System;
class Program { static void Main() { var MyC = new MyClass(3); var MyS = new MyStruct(4); Test_C(MyC); Test_S(MyS); Console.WriteLine(MyC.A); Console.WriteLine(MyS.A); } static void Test_C(MyClass t) { t = new MyClass(7); } static void Test_S(MyStruct t) { t = new MyStruct(9); } }
class MyClass { public int A; public MyClass(int a) { A=a; } }
struct MyStruct { public int A; public MyStruct(int a) { A=a; } } |
Ausführbar hier:
http://www.compileonline.com/compile_csharp_online.php
Bei der Klasse und dem struct passiert im Grunde das gleiche. Und bei beiden wird das Verhalten geändert, wenn ref-Parameter benutzt werden.
Ralf Jansen - Mi 03.07.13 10:52
| Zitat: |
| Referenz vs. Wertetypen zu verstehen kann natürlich nicht schaden, trifft aber nicht den Kern des Problems. |
Sein gezeigter Code hat dummerweise ein anderes Problem als seine eigentlich Frage :wink: Du hast das Codeproblem beantwortet, der Hinweis auf die Kopiersemantik bei Valuetypen seine eigentliche Frage.
Das eigentliche Problem, Referenz in der Tag Property verwahren läßt sich nur lösen wenn man auch eine Referenz nimmt und eben keinen Wert. Da hilft auch kein ref Schlüsselwort. Desc muß eine Klasse sein.
Palladin007 - Mi 03.07.13 12:41
Wann ist es eigentlich überhaupt sinnvoll, eine Struktur zu verwenden?
Nach allem, was ich darüber gelesen habe, ich glaub ich hab kapiert, was der Unterschied ist, aber der Sinn wird mir nicht ganz klar. Wann und Wo nutzt das denn bitte etwas und vor allem: Warum nutzt es da etwas?
Palladin007 - Mi 03.07.13 12:51
Die Seite kannte ich ja gar nicht ...
Wäre ja auch gelacht, wenn Microsoft nicht einen guten Artikel zu irgendeinem Thema seines Programmier-Flaggschiffes bereit stellt :D
Danke für den Link ^^
Ralf Jansen - Mi 03.07.13 12:58
Wenn dir die Guidelines gefallen würde ich dir das Buch dazu wärmstens ans Herz legen. Es ist nicht einfach nur der Inhalt der MSDN sondern spannend kommentiert von einigen bekannten Größen aus der C# Szene.
SharinganShuriken - Mi 03.07.13 14:00
Hallo liebe Community,
das ist ja total lieb von euch das ihr Euch so für mich ins Zeug legt und postet, danke erst mal an alle aber Ralf hatte recht, ich suche eigentlich eine Möglichkeit etwas in einem Tag Object/Verweiß zu ändern aber das die Änderung auch auf die Quelle Auswirkungen hat, weißt Jemand wie das geht ?
Alles Liebe
SharinganShuriken
Palladin007 - Mi 03.07.13 14:04
Also die Referenz zu ändern?
Das ist das Grundprinzip von Objekten und Klassen, das sind von sich aus schon Referenztypen, aber bei Wertetypen geht das meines Wissens nach nicht so leicht.
Da müsstest du dann wohl mit dem ref-Schlüsselwort arbeiten, oder out, je nachdem, was du brauchst.
Aber ich denke, wenn du die Möglichkeit hast, das zu entscheiden, dann lass die Strukturen bleiben, nimm Klassen.
In dem Link von Ralf steht auch, wo man am besten struct verwendet, aber das heißt ja nicht, dass man da dann struct verwenden muss. Brauchst du einen Referenztyp, kannst du trotzdem eine Klasse nehmen.
SharinganShuriken - Mi 03.07.13 14:09
Hallo,
im meinem Fall brauche ich die structs, ich habe in einem Tag Object eine Person Beschreibung hineingeschrieben und diese möchte ich gerne per Laufzeit ändern, das habe ich so gemacht:
C#-Quelltext
1: 2:
| desc beschreibung = (desc)treeNode.Tag; beschreibung.Name = "Klaus01"; |
Im Object beschreibung ändert sich dann der Name aber im Original Object (Person Beschreibung) das ich in die Tag geschrieben habe ändert sich überhaupt nichts,
wieso eigentlich, habe doch kein new Schlüsselwort benutzt ?
Alles Liebe
SharinganShuriken
ps. Habe die struct auch in eine Klasse abgewandelt um es zu testen aber habe das selbe Ergebnis bekommen :(
Palladin007 - Mi 03.07.13 14:25
So ganz verstehe ich jetzt nicht, wozu du unbedingt struct brauchst, aber das ist ja auch gar nicht so wichtig :D
Aber dann nimmst du halt immer ref, dann wird der Wertetyp auch als Referenztyp behandelt. Zwar nur innerhalb dieser einen Methode, aber das reicht ja auch aus.
Warum du kein new benutzt hast, kann ich dir nicht sagen, aber es gibt die Möglichkeit,
implizite Konvertierungen [
http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_07_003.htm#mj575908d65c71f73b36f7d7316b6abe76] zu schaffen, also dass du einfach so schreibst:
C#-Quelltext
1:
| desc beschreibung = "name"; |
Und dann hast du gleich den Name, wo er sein soll. Ob das in deinem Fall sinnvoll ist, sei aber mal dahin gestellt :D
Hier mal ein Beispiel:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| public static implicit operator desc(string txt) { desc result = new desc(); result.Name = txt; return result; } |
Das in die Klasse/Struktur, dann funktioniert auch das Beispiel von oben.
Oder, was bei dir auch sein kann, Tag ist eine Eigenschaft, die schlicht diesen Typ gibt :D
Ralf Jansen - Mi 03.07.13 14:30
| Zitat: |
| im meinem Fall brauche ich die structs |
Hier ist mehrmals auf den Unterschied zwischen Wertetypen und Referencetypen hingewiesen wurden. Da hast dir offensichtlich nicht die entsprechenden Verlinkungen angesehen oder sonstwie versucht das zu verstehen. Da dir der Unterschied nicht klar ist kannst du gar nicht Wissen das du structs brauchsts.
Warum muss das also ein struct sein wenn du gar nicht weißt wofür structs gut sind?
Wenn du eine Referenz in Tag speichern willst mußt du eine Referenz nahmen und keinen Wert. Und struct benutzen heißt dich interessiert nur der Wert nicht die Referenz. Lösung ist eine Klasse benutzen.
Der ganze Aufbau deines desc structs schreit geradezu 'ich muß eine Klasse sein'.
| Zitat: |
| Oder, was bei dir auch sein kann, Tag ist eine Eigenschaft, die schlicht diesen Typ gibt :D |
http://msdn.microsoft.com/de-de/library/system.windows.forms.control.tag.aspx
Palladin007 - Mi 03.07.13 14:37
Ja, das viel mir gerade auch ein und hab deshalb den Kommentar noch entfernt - scheinbar nicht schnell genug *schäm*
Ralf Jansen - Mi 03.07.13 14:45
| Zitat: |
| ps. Habe die struct auch in eine Klasse abgewandelt um es zu testen aber habe das selbe Ergebnis bekommen :( |
In dem Fall solltest du relevanteren Code zeigen. Solange du die gleiche Instanz von desc an verschiedene Tag Properties gehängt hast wird das funktionieren.
SharinganShuriken - Mi 03.07.13 17:25
Mein Computer will mich verarschen, gestern habe ich es auf Class umgestellt und es ging nicht und heute auf einmal schon, tja ich glaube inzwischen da ist was wahres dran das Computer ihren eigenen Kopf haben, tausend Dank noch mal an Alle,
Ihr könnt euch garnicht vorstellen wie sehr Ihr mir weitergeholfen habt, ich könnt euch alle knutschen xDDDD
Alles Liebe
SharinganShuriken
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!