PictureBoxen zur Laufzeit erstellen
-
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!