PictureBoxen zur Laufzeit erstellen
-
Knuddlbaer schrieb:
"string" wird auch nicht als referenz uebergeben sondern als kopie, sofern es nicht bestandteil einer klasse ist
Wie kommst Du nun drauf ?
ublic sealed class String
spricht doch sehr dafür das auch ein String als Referenz übergeben wird.
weil ich es getestet hab, schau mal den code oben an, und das ergebnis, ich kuerz es mal der uebersicht zuliebe zusammen:
class TextClass { public TextClass(string text) { Value = text; } public string Value { get; set; } } //------------------------------------------------------- static void Changer(string p) { p = "11"; } static void Changer(TextClass p) { p.Value = "11"; } //------------------------------------------------------- static void Main(string[] args) { string numberText = "1"; TextClass textClass = new TextClass("1"); Console.WriteLine("Before string: " + numberText); Console.WriteLine("Before textclass: " + textClass.Value); Changer(numberText); Changer(textClass); Console.WriteLine("After string: " + numberText); Console.WriteLine("After textclass: " + textClass.Value); }
Console schrieb:
Before string: 1
Before textclass: 1
After string: 1
After textclass: 11wie man sieht ist der string nur veraendert wurden wenn er in einer klasse gekapselt ist
und wenn man sich das gesamte beispiel in mein vorherigen posting an schaut, sieht man das es nur als referenz uebergeben wird wenn es eine eigene klasse ist
int, long, string usw werden als kopie uebergeben - obwohl es auch nur klassen sind /=
-
Tu Dir doch einfach mal selbst den gefallen und schau Dir die String Klasse mal in der Dokumentation an. Man kann mit etwas Intuition schon gut raten und eine Richtung für die Dokumentation haben um weitere Informationen zu suchen.
Die von Dir genannten Beispiele und diese Diskussion wären für mich der Anlass noch mal in die Dokumentation zu schauen. Aber selbst ohne dem Wissen, das System.String nicht änderbar ist und jede Änderung eine neue Instanz von System.String erzeugt ist die Erkenntnis die Du aus Deinem Beispielcode zeigst noch ausbaufähig.
namespace ConsoleApplication2 { class Beispielklasse { public override string ToString() { return name; } string name; /// <summary> /// Initializes a new instance of the Beispielklasse class. /// </summary> /// <param name="name"></param> public Beispielklasse(string name) { this.name = name; } public static void Changer(Beispielklasse var) { var = new Beispielklasse("Changer(Beispielklasse var)"); } public static void Changer(ref Beispielklasse var) { var = new Beispielklasse("Changer(ref Beispielklasse var)"); } } class Program { static void Main(string[] args) { Beispielklasse bsp = new Beispielklasse("Main"); Console.WriteLine(bsp); Beispielklasse.Changer(bsp); Console.WriteLine(bsp); Beispielklasse.Changer(ref bsp); Console.WriteLine(bsp); } } }
Beispielklasse.Changer(bsp);
Hier wird eine Kopie der Referenz erzeugt. Die Kopie der Referenz wird auf einen neuen Wert gesetzt.
class Program { public static void Changer(string var) { var = "changer(string)"; } public static void Changer(ref string var) { var = "changer(ref string)"; } static void Main(string[] args) { string test = "Main"; Console.WriteLine(test); Program.Changer(test); Console.WriteLine(test); Program.Changer(ref test); Console.WriteLine(test); } }
Ist das gleiche - nur in grün (bzw. string);
-
int und long sind structs, also ist die nicht-Änderung okay.
Bei string s ist das wie in Java. s="bla" erzeugt ein neues Objekt, da man einen string nach dem Erstellen nicht mehr ändern kann (StringBuilder hingegen würde wie erwartet ändern).
-
void Foo(object x) //x ist eine _Kopie der Referenz_ auf den übergebenen Parameter { x = new object(); } ... object myObj, otherObj; myObj = otherObj = new object(); Foo(myObj); System.Diagnostics.Debug.Assert(myObj == otherObj);
Ansonsten kann man schreiben
void Foo(ref object x) //oder void Foo(out object x)
-
Knuddlbaer schrieb:
...
Hier wird eine Kopie der Referenz erzeugt. Die Kopie der Referenz wird auf einen neuen Wert gesetzt.
...
Ich war zu langsam. Aber wer hätte gedacht, dass vor acht Uhr noch andere Leute posten.
-
im fall von string wird die referenz kopiert - der kopie dann ein neuen wert zugewiesen
dieser verfaellt nach ende der sichtbarkeit
soweit kann ich das unterschreiben - die tests haben das auch ergeben
nur_wonach_ kann cih gehen ? Int32, String sind alles genauso klassen wie eigene
warum werden diese kopiert uebergeben aber eigene klassen nicht??
das ist gerade das problem - beim entwickeln weiss man nicht unbedingt wie der wert an kommt - und da muss man manchmal echt aufpassen
ich hab bisher kein gemeinsamen tonus erkennen koennen// nicht geaendert
static void Change(string value) { value = "neu"; Console.WriteLine(value); } static void Main(string[] args) { string value = "begin"; Console.WriteLine(value); Change(value); Console.WriteLine(value); }
// geaendert
class Value { public string Text; public Value(string value) { Text = value; } } static void Change(Value value) { value.Text = "neu"; Console.WriteLine(value.Text); } static void Main(string[] args) { Value value = new Value("begin"); Console.WriteLine(value.Text); Change(value); Console.WriteLine(value.Text); }
ersteres wird also kopierte referenz uebergeben welches verfaellt - zweiteres wird als "echte" referenz uebergeben
woran kann man den unterschied festhalten ? sind beides klassen!@Any Mod, koennte man diese diskusion in einen eigenen thread splitten?
-
Mr Evil schrieb:
// nicht geaendert
static void Change(string value) { value = "neu"; //Setzt die Referenz auf ein neues Objekt Console.WriteLine(value); } ... // geaendert static void Change(Value value) { value.Text = "neu"; //setzt eine Property des Objektes auf neues Objekt Console.WriteLine(value.Text); }
Mr Evil schrieb:
ersteres wird also kopierte referenz uebergeben welches verfaellt - zweiteres wird als "echte" referenz uebergeben
woran kann man den unterschied festhalten ? sind beides klassen!Es ist beides gleich. nur das erste mal erzeugst du ein neues Objekt und weist es der Referenz zu und das andere Mal benutzt du die Referenz um eien Property des Objektes zu setzten.
-
Wir sollten die Diskussion an dieser Stelle abbrechen und auf die Grundlagen Literatur verweisen. Bisher ist an Erkenntnissen wenig bis nix angekommen.
Die Unsicherheit werden wir wohl nicht ausdiskutieren können.
-
@hajb
ich glaub ich versteh - wenn ich
value.Text = "neu"; mit
value = new Value("neu"); ersetz, ist es das selbe verhalten wie beim string
also weise der referenz ein neuen wert zu - dh die referenz zeigt auf ein neues objekt (eher vergleichbar mit c++ pointern bla = &object;)koennte man nicht sagen: der wert wird nicht geaendert sobald man der referenz direkt etwas zuweist? zuweisung per = sowie aehnlichen operatoren wie += *= usw ??
oder noch simpler das man diese kopierte referenz mit c++ pointern vergleicht?
-
noch simpler das man diese kopierte referenz mit c++ pointern vergleicht?
Streich das kopierte und es passt.
-
Zu meinem Problem; die Erstellung der Objekte klappt ja nun bestens, nur die Verteilung auf dem Panel nicht:
Knuddlbaer schrieb:
Geht Dein Panel überhaupt über die gesamte Fläche oder klebt die einfach nur mittendrinn ?
Dem Panel ist "Dock fill" zugewiesen, ich klickte im Designer "in übergeordneten Container abdocken".
EDIT: Hat sich erledigt, das Problem war dass wohl etwa doppelt so viele Pictureboxen erzeugt wurde da ich nach dem Tip mit dem Controls.add in der foreach-Schleife dort die Pictureboxen nochmals hinzufügte, und da wurden an beiden Orten wohl welche erstellt... Nun habe ich die Anweisung entfernt und es sieht bestens aus!