C# Klassen mit gleichem Namen unterscheiden

KingJoshii1000

Lieutenant
Registriert
Apr. 2010
Beiträge
879
Hallo,
ich hab folgendes vor, ich hab einen Windows Form mit einem Button. Beim betätigen dieses Buttons wird ein neuer Button erstellt, beim erneut betätigen wieder nur mit einer neuen X Koordinate.
Code:
    public partial class Form2 : Form
    {
        int x = 13;
        int count = 0;
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Button asd = new Button();
            asd.Location = new Point(x, 13);
            x = x + 60;
            asd.Text = "Button " + count;
            count = count + 1;
            asd.Size = new Size(75, 23);
            Controls.Add(asd);
            asd.Click += new EventHandler(button_click);
        }
        private void button_click(object sender, EventArgs e)
        {
            label1.Text = Convert.ToString(sender);
        }
    }
}
Folgendes: Ich erstelle nun 3 Buttons und möchte den Text von Button 2 ändern, wie stelle ich das an?
Die Buttons heißen von der Button Klasse her ja alle "asd".
Wie kann ich sie trotzdem unterscheiden bzw auf jedes einzelne später zugreifen und Werte ändern?

Mit freundlichen Grüßen:)
 
Hi,

Die Buttons heißen von der Button Klasse her ja alle "asd".

Nein, die Klasse ist "Button", "asd" ist der Name des instanziierten Objekts! Vergib doch einfach einen anderen Namen, wo ist das Problem?

VG,
Mad
 
Nutz am besten eine Liste. Dann packste die Buttons da rein und kannst dann jeden über ne for each in der liste ansprechen. Dann brauchste nicht mal mehr Namen.
 
Wenn du die Unterscheidung nur in der Methode button_click brauchst, kannst du den parameter "object" verwenden, den der ist die Referenz auf den Button
 
Hi,

da ihm offensichtlich der Unterschied zwischen Instanz und Klasse nicht einmal klar ist habe ich den Begriff "Name" in diesem Fall verwendet um zu verdeutlichen, dass das Objekt auf diese Zeichenfolge "hört". Zumal "Bezeichner" durchaus als "Name" durchgeht...

VG,
Mad
 
Ich bedanke mich herzlichst bei allen. Habe die passende Idee umsetzen können und es funktioniert perfekt :).

Vielen Dank

Mit freundlichen Grüßen
 
kinglouy schrieb:
Das Objekt liegt auf dem Heap und hat keinen Namen.
Da es sich in diesem Fall um ein Object vom Typ Button handelt, das eine Eigenschaft mit dem Bezeichner Name hat, könnte man durchaus davon sprechen, dass das Objekt einen Namen hat.


Madman1209 schrieb:
habe ich den Begriff "Name" in diesem Fall verwendet um zu verdeutlichen, dass das Objekt auf diese Zeichenfolge "hört".
Das Objekt selbst hört aber nicht auf diese Zeichenfolge, sondern nur die Variable.
Weist du ihr z.B. einfach eine null reference zu, dann hört das Objekt auf gar nix mehr.


captmcneil schrieb:
... es gibt nen feinen Grad schmalen Grat zwischen "korrigieren" und "pingelig sein"^^


Mit freundlichen Grüßen,
Captain Korinthe :p
 
Zuletzt bearbeitet: (Korrektur)
Hi,

Das Objekt selbst hört aber nicht auf diese Zeichenfolge, sondern nur die Variable.

Nein, das instanziierte Objekt kann selbstverständlich mit "asd" angesprochen werden. "asd" ist keine "Variable", sondern ein Objekt. Punkt. Erkennt man doch bitte am Konstruktoraufruf!

Weist du ihr z.B. einfach eine null reference zu, dann hört das Objekt auf gar nix mehr.

Wenn ich einem Objekt "null" zuweise, also in diesem Fall schreibe "asd = null;" ist das Objekct nach wie vor mit "asd" ansprechbar, solange ich noch im Kontext bin und der GC noch nicht gelaufen ist.

Wenn Korinthen k*cken dann bitte wenigstens richtig!

VG,
Mad
 
Ich hab mir doch nur nen kleinen Spaß gemacht, lach doch lieber ein bisschen anstatt auf meinen Blödsinn einzugehen ;) (macht Gesund :))
---

Madman1209 schrieb:
Wenn ich einem Objekt "null" zuweise, also in diesem Fall schreibe "asd = null;" ist das Objekct nach wie vor mit "asd" ansprechbar, solange ich noch im Kontext bin und der GC noch nicht gelaufen ist.
Demzufolge dürfte dieser Code keine NullReferenceException werfen:
Code:
Object o = new Object();
o = null;
string s = o.ToString();

Madman1209 schrieb:
Nein, das instanziierte Objekt kann selbstverständlich mit "asd" angesprochen werden.
Die Variable, die die Referenz auf das Objekt hält, kann mit "asd" angesprochen werden.
Das Objekt selbst liegt auf dem Heap.
 
Hi,

Demzufolge dürfte dieser Code keine NullReferenceException werfen

Habe ich nie behauptet! Nur, dass das "asd" Objekt (oder in deinem Fall "o") dann nicht mehr existiert stimmt eben nicht!

Dass du bei einem Objekt, dass den Wert null zugewiesen bekommt, nicht auf Methoden oder Eigenschaften Zugreifen kannst sollte klar sein. Sobald du dem Objekt den Wert null zuweist verweist es automatisch nicht mehr auf die Instanz. Existieren tut es aber selbstverständlich noch und auch auf "o" hören in deinem Fall, sonst würde dir der Compiler schon um die Ohren fliegen. Oder probiere einfach mal, was ohne die Objektinstanziierung mit deinem Code passiert (Sprich nur noch "string s = o.ToString();" da steht).

"asd" ist natürlich immer nur ein Objektverweis - allerdings auch nur in Sprachen wie C#, die managed und safe sind und natürlich liegt das Objekt im Heap. Ich habe nichts anderes behauptet.

Mit einem Konstruktoraufruf instanziierst du ein Objekt einer Klasse - das ist absolut allgemeingültig formuliert und mit Sicherheit korrekt. Und dass in C# das Objekt für dich mit dem Objektbezeichner ansprechbar ist dürfte auch wenig Diskussion erfordern.

C# lässt dich nicht direkt mit dem Objekt sprechen sondern immer nur mit einem Objektverweis - ich dachte nicht, dass man darauf in einer Sprache wie C# noch extra hinweisen muss.

Allgemein gültig ist diese Aussage aber längst nicht. Aber lassen wir das, der TE hat seine Lösung und weiter streiten will ich mich nicht zu solchen Themen. Dazu ist meine Zeit zu wichtig um mich hier rechtfertigen zu müssen, weil ich einem Anfänger der Einfachheit halber eine simplifizierte Version des selben Sachverhalts erklären wollte, ohne derartig tief in die Materie zu gehen. Seine Aussage, "asd" wäre die Button-Klasse war in jedem Fall nicht korrekt, das wollte ich ihm mitteilen und ihm helfen. Nicht mehr, nicht weniger. Deswegen bin ich hier jetzt auch raus.

VG,
Mad
 
Madman1209 schrieb:
Nur, dass das "asd" Objekt (oder in deinem Fall "o") dann nicht mehr existiert stimmt eben nicht!
Sowohl "o", als auch "asd" sind Bezeichner für Variablen, keine Objekte.
Objekte haben keinen Bezeichner. Nur die Variable die auf das Objekt verweist hat einen Bezeichner.

Madman1209 schrieb:
Existieren tut es aber selbstverständlich noch und auch auf "o" hören in deinem Fall, sonst würde dir der Compiler schon um die Ohren fliegen.
Ja, das Objekt existiert im Speicher so lange, bis der GC es disposed.
Aber es kann nicht mehr mit "o" angesprochen werden, weil die Variable mit dem Bezeichner "o" nicht mehr auf das Objekt verweist. Ohne Referenz, kannst du das Objekt nicht ansprechen.

Und der Compiler meckert nur deswegen nicht, weil die Varaible "o" definiert ist und auch irgendwo vorher initialisiert wurde. Ob ein Objekt existiert ist dem wurscht.

Das kompiliert:
Code:
Object o = null;
string s = o.ToString();

Madman1209 schrieb:
Und dass in C# das Objekt für dich mit dem Objektbezeichner ansprechbar ist dürfte auch wenig Diskussion erfordern.
Genau das ist der Punkt an dem du falsch liegst.
Es gibt keinen "Objektbezeichner" sondern nur einen "Variablenbezeichner".
Du sprichst über den Bezeichner ("o") die Variable an. Du kannst ihren Wert auslesen, oder überschreiben.
Der Wert ist in diesem Fall eine Referenz. Die Referenz liegt auf dem Stack und zeigt auf ein Objekt, das auf dem Heap liegt.

Es kommt dir nur so vor, als hätte das Objekt einen Bezeichner und du könntest es direkt ansprechen, weil du in managed Sprachen den Zeiger auf das Objekt (der in der Variable "o" gespeichert ist) nicht erst dereferenzieren musst um auf das Objekt zuzugreifen.

Madman1209 schrieb:
Dazu ist meine Zeit zu wichtig um mich hier rechtfertigen zu müssen, weil ich einem Anfänger der Einfachheit halber eine simplifizierte Version des selben Sachverhalts erklären wollte
Naja, mit meinem ersten Post in diesem Thread habe ich dir ja indirekt zugestimmt, dadurch dass ich die Pingeligkeit von kinglouy etwas auf die Schippe genommen habe. Mehr steckt da auch garnicht dahinter.

Hättest du das ganze mit nem Augenzwinkern gesehen - so wie es auch gemeint war - dann wärs garnicht zu dieser Diskussion gekommen.
Evtl. hätte ich noch ein paar mehr Smileys einbauen sollen, damit besser klar wird wie mein Post gemeint war. :(
 
Hi,

Objekte haben keinen Bezeichner. Nur die Variable die auf das Objekt verweist hat einen Bezeichner.

Lustig, dass Microsoft dann von Objektbezeichner spricht (einfach mal die Docs lesen, Stichwort "object identifier", was Microsoft mit "Objektbezeichner" übersetzt).

Es gibt keinen "Objektbezeichner" sondern nur einen "Variablenbezeichner".

Siehe oben.

Heap...Stack...Objekt...

Genau das habe ich geschrieben. Siehe:

"asd" ist natürlich immer nur ein Objektverweis - allerdings auch nur in Sprachen wie C#, die managed und safe sind und natürlich liegt das Objekt im Heap. Ich habe nichts anderes behauptet.

Ich bin lange genug Entwickler, um auch über den Tellerand von .NET-Sprachen und managed Code geblickt zu haben und auch immer noch zu nutzen. Deswegen verwende ich lieber allgemein gültige Aussagen als im speziellen Fall dann einzelne Haare spalte zu müssen, weil ein Fachterminus gegenüber einem Laien nicht so verwendet wurde wie du es vielleicht gelernt hast. Ich arbeite an anderen Projketen, als bei Windows 8 Tiles die Hintergrundfarbe zu ändern, von daher ist meine Erfahrung im Bereich unmanaged Code vielleicht eine andere als deine, das mag durchaus sein und ist nicht verwerflich.

Ich habe versucht, einem Anfänger (!) die Grundlagen mit einfachen Mitteln und simpler (wenn auch nicht 100% fachlich korrekter, wobei das sehr im Auge des Betrachters liegt) Sprache näher zu bringen. Werde ich einfach künftig unterlassen und mich auf solche Diskussionen gar nicht mehr einlassen. Finde ich sehr schade, ziehe aber meine Konsequenzen daraus.

Ob jetzt Smilies oder nicht: ich habe nichts gegen eine Diskussion, nur sollte man so viel sein und auch einmal einsehen, dass die eigene Sichtweise vielleicht a) nicht allgemein gültig ist und b) nicht die einzige auf der Welt.

VG,
Mad

PS: Spar dir gerne weitere Kommentare, ich werde hier nicht mehr weiter lesen...
 
Zuletzt bearbeitet:
asdfman schrieb:
Woah, ihr seid ja schlimmer als ich. Hut ab :3
Ja ja, zu was einen eine gesunde Mischung aus Pedanterie und Prokrastination befähigen ist schon (buchstäblich) der Wahnsinn. :D
(eigentlich sollte ich jetzt arbeiten :o)


Madman1209 schrieb:
Deswegen verwende ich lieber allgemein gültige Aussagen als im speziellen Fall dann einzelne Haare spalte zu müssen, weil ein Fachterminus gegenüber einem Laien nicht so verwendet wurde wie du es vielleicht gelernt hast.
Falls es dir immernoch nicht aufgefallen ist: Ich habe dich nirgends kritisiert. Ich hätte genauso gesagt, dass es sich um ein Objekt handelt und nicht um eine Klasse.
Wie gesagt, war das nur etwas Spaß. Ich hab echt nicht damit gerechnet, dass sich da jemand auf den Schlips getreten fühlt.

Mir gehts doch garnicht drum wer Recht hat.
Du hast dich ungenau ausgedrückt, ich habs übertrieben genau ausgedrückt weil ich micht ein bisschen über die Korinthenkackerei in diesem Thread lustig machen wollte. Ein bisschen Satire eben.


Madman1209 schrieb:
Werde ich einfach künftig unterlassen und mich auf solche Diskussionen gar nicht mehr einlassen.
Ganz ehrlich, nimms nicht so ernst ;)

Die Quintessenz dieser blödsinnigen Diskussion:
Grantig schrieb:
Ich hab mir doch nur nen kleinen Spaß gemacht, lach doch lieber ein bisschen anstatt auf meinen Blödsinn einzugehen ;) (macht Gesund :))
Grantig schrieb:
Mit freundlichen Grüßen,
Captain Korinthe :p
 
Entweder du speicherst es in einen Dictionary mit Key:Nr, Value: BUTTON oder du erzeugst eine neue Klasse die vom Button abgeleitet ist und überscheibst deren Equals und GetHashcode

oder du schreibst in den Tag bereich deine nummer und suchst, in dem Control wo die Buttons erzeugt wurden, alle buttons mittels LINQ nach dem Tag eintrag.
 
Zurück
Oben