Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 07.08.15 15:26 
Hallo Leute. Ich habe mirgendwie auf YouTube ein Video angeguckt über explizite Konvertierungen. Das hat mir jedoch nicht weitergeholfen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
private void buttonDelete (object sender, EventArgs e)
{
  Button button1 = new Button ();
  button1 = (Button)sender;
}


Was bedeutet dieses Object und der Code?
Mfg :)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 07.08.15 17:40 
Der Code erzeugt einen überflüssigen Button an einer Variablen.
Und weißt dann der Variablen ein Object zu das auf den Typ Button gecastet wird. Wenn das Object (sender) kein Button war wird der Code an dieser Stelle eine Exception werfen.

Simpelst Beispiel für explizit vs. implizit.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
int i = 1;
long l;

l = i;        // implizit
l = (long)i;  // explizit


Implizit der Code macht die Umwandlung einfach weil klar ist wie die Umwandlung (hier von int nach long) stattzufinden hat.
Explizit man sagt dem welche Umwandlung zu vollzuziehen ist mit einem Hinweis via cast, der geklammert Typ. Die explizite Erwähnung der long Umwandlung im obigen Fall ist wie hoffentlich auffällt unnötig ohne gehts ja auch. Wenn wir aber das Ganze umdrehen

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
int i;
long l = 1;

i = l;       // implizit (Compiler wird das nicht zulassen)
i = (int)l;  // explizit


wird der Compiler meckern. Der implizite Fall ist nicht erlaubt da beim Umwandeln ein Datenverlust stattfinden könnte. Ein int passt immer in einen long aber nicht zwingend umgekehrt.
Da muß man das explizit machen was andeuten soll das der Programmierer weiß was er tut und den potentiellen Datenverlust in Kauf nimmt.


Bezogen auf deinen Beispiel. sender ist ein Object und button1 ein Button. Ich könnte also problemlos sender = button1; ausführen. Da alles ein object ist und Button natürlich auch. Umgekehrt
button1 = sender; aber nicht zwingend. sender ist nur als object definiert kann also alles mögliche sein. Ein Button wäre nur eine Möglichkeit. Man ist also gezwungen da den cast auf Button explizit hinzuschreiben um den Compiler zu sagen "hey ich weiß was ich mach, da steht zwar object in der Methodensignatur aber ich weiß da wird immer nur ein Button rüber kommen". Du mußt halt im Zweifel damit leben das wenn deine Annahme nicht stimmt das da eine Exception erfolgt. Wenn es zum Beispiel ein Label war und gar kein Button wird es eine Exception geben weil es zwischen Label und Button keine Umwandlungs gibt (Klassen können Umwandlungsmethoden von und zu anderen Klassen haben und zwischen Button und Label gibt es keine).

Für diesen Beitrag haben gedankt: Csharp-programmierer
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 07.08.15 17:51 
Hallo,

kannst dir auch mal das Kapitel Konvertierungen durchlesen.

Für diesen Beitrag haben gedankt: Csharp-programmierer
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 07.08.15 21:58 
Vielen Dank für eure Antworten :)
Motz
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 19.02.16 18:21 
Explizit bedeutet, dass der Variablentyp links vom Gleichzeichen größer ist als der rechts. So kann der Compiler problemlos eine Zuweisung machen. Es können also keine Daten verlorengehen. Ansonsten muss du den gewünschten Typ in Klammern vorstellen, dann liegt die Verantwortung aber bei dir und nicht mehr beim Compiler