Autor |
Beitrag |
SharinganShuriken
      
Beiträge: 33
Windows 7 Home Premium (64 Bit)
Visual Studio 2010 Professional, C# - SlimDX - Direct3D11
|
Verfasst: Mi 03.07.13 01:23
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
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.07.13 05:46
Was du suchst ist einen Parameter als Referenz übergeben, dafür gibt es das Schlüsselwort ref:
msdn.microsoft.com/d...studio/14akc2c7.aspx
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 03.07.13 09:40
Hallo SharinganShuriken,
du solltest dich mal über den Unterschied von Werte- ( struct) und Referenztypen ( class) informieren, z.B. C# Concepts: Value vs Reference Types.
Daher habe ich auch den Titel geändert, da es sich bei deiner Frage nicht um Zeiger handelt.
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 03.07.13 09: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: 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: www.compileonline.co...le_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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.07.13 11: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  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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 03.07.13 13: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?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.07.13 13:46
@ Palladin007 Für solche und ähnliche Fälle lohnt sich immer ein Blick in die Framework Design Guidlines.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 03.07.13 13: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
Danke für den Link ^^
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.07.13 13: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.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 03.07.13 14:10
Gibt es das auch als kostenlose Online-Version und auf Deutsch?
Ich hatte jetzt erst einmal vor, mir das Buch Professionell entwickeln mit Visual C# 2012 zu kaufen, aber nach den 60€ bleibt mir leider gar nicht mehr so viel übrig.
|
|
SharinganShuriken 
      
Beiträge: 33
Windows 7 Home Premium (64 Bit)
Visual Studio 2010 Professional, C# - SlimDX - Direct3D11
|
Verfasst: Mi 03.07.13 15: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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 03.07.13 15: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 
      
Beiträge: 33
Windows 7 Home Premium (64 Bit)
Visual Studio 2010 Professional, C# - SlimDX - Direct3D11
|
Verfasst: Mi 03.07.13 15: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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 03.07.13 15:25
So ganz verstehe ich jetzt nicht, wozu du unbedingt struct brauchst, aber das ist ja auch gar nicht so wichtig
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 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
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 
Zuletzt bearbeitet von Palladin007 am Mi 03.07.13 15:37, insgesamt 2-mal bearbeitet
Für diesen Beitrag haben gedankt: SharinganShuriken
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.07.13 15: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  |
msdn.microsoft.com/d...rms.control.tag.aspx
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 03.07.13 15:37
Ja, das viel mir gerade auch ein und hab deshalb den Kommentar noch entfernt - scheinbar nicht schnell genug *schäm*
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.07.13 15: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.
Für diesen Beitrag haben gedankt: SharinganShuriken
|
|
SharinganShuriken 
      
Beiträge: 33
Windows 7 Home Premium (64 Bit)
Visual Studio 2010 Professional, C# - SlimDX - Direct3D11
|
Verfasst: Mi 03.07.13 18: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
|
|