Coders Chit-Chat

08/02/2015 21:14 Logtetsch#136
Quote:
Originally Posted by warfley View Post
Für so etwas bietet C# doch den Konstruktor von Structs, ich denke dass es deshalb nicht in die Sprache implementiert wurde.
Für Structs gibt es keinen Default-Konstruktor. Auch eine explizite Implementierung führt zu einem Compiler Fehler, eben wegen dieser Tatsache:

Quote:
Originally Posted by MrSm!th View Post
Ein Integer bekommt also den Wert 0, ein Boolean false und eine selbst definierte Struct bekommt alle ihre Felder auf die jeweiligen Defaultwerte gesetzt (also null für Referenztypen, 0-wertig für Werttypen).
Das liegt einfach daran, dass Werttypen auf dem Stack gespeichert werden und dieser mit Nullen vorinitialisiert wird.
Den Standardkonstruktor (also den ohne Parameter) einer Struct kann man nicht selbst implementieren, eben aufgrund dieser eingebauten Mechanik.

Mit anderen Worten: Du kannst nicht definieren, welchen Standardwert eine Struct bekomt. Es ist immer null/0/false/... für alle Felder der Struct.
Quote:
Originally Posted by warfley View Post
Die Frage die man sich nun allerdings stellen sollte ist, wie sinnvoll ist es überhaupt Structs in C# zu verwenden, bis auf die Referenzsemantik sehe ich da eigentlich keinen Unterschied mehr zwischen Structs und Klassen.
Klar haben sie eine Exsistenzberechtigung (z.B. um mit DLL's die in anderen Sprachen geschrieben wurden zu kommunizieren) aber ansonsten sehe ich keinen wirklichen Vorteil
[Only registered and activated users can see links. Click Here To Register...]
tltr?; Ich habs auch noch nicht gelesen.
08/03/2015 02:51 MrSm!th#137
Quote:
Originally Posted by Logtetsch View Post
Wieso kann man in C# die member einer struct nicht direkt "vorinitialisieren"? Dass ich mich damit einfach abfinden muss, ist mir klar, allerdings würde es mich interessieren, ob es hierfür einen gewissen Hintergrund gibt? Bringt diese Regel irgendwelche Vorteile mit sich? Hängt es vielleicht damit zusammen, dass struct ein Value-Type ist und die CLR den content meines Objektes beim Erstellen (mit new, oder nicht) sowieso auf ihre default-Werte setzt?

Code:
struct Foo
{
     //Compiler Fehler
     int sample = 5;

     //Korrekt
     int sample;
}
Korrekt. Am Anfang einer Methode wird der Stackframe mit 0en vorinitialisiert. Struct-Objekte landen auf dem Stack. Daher hat eine Struct alle Felder mit 0/null vorinitialisiert und das kannst du nicht anpassen.
Der Grund ist übrigens höchstwahrscheinlich die Performance. Den Stack mit 0en auffüllen zu können ohne irgendwelche etwaigen custom Konstruktoren von manchen Valuetype-Objekten beachten zu müssen ist schneller und erlaubt mehr Optimierungen.

Quote:
Originally Posted by Logtetsch View Post
Da hast du etwas missverstanden. Mir geht es hierbei um das setzen von Feldern, noch bevor der Konstruktor aufgerufen wird. Bei Klassen funktioniert es ausgezeichnet.
Code:
struct Foo1
{
     //Compiler Fehler
     int sample = 5;
}

class Foo2
{
     //Alles OK
     int sample = 5;
}
Die Lazy-Initialization ist nur eine kürzere Schreibweise dafür, die Felder im Konstruktor zu initialisieren. Es ist dasselbe Prinzip und deshalb gelten dieselben Einschränkungen.

Quote:
Originally Posted by warfley View Post
Für so etwas bietet C# doch den Konstruktor von Structs, ich denke dass es deshalb nicht in die Sprache implementiert wurde.
Nein. Bei Structs lässt sich kein eigener Standardkonstruktor definieren.

Quote:
Die Frage die man sich nun allerdings stellen sollte ist, wie sinnvoll ist es überhaupt Structs in C# zu verwenden, bis auf die Referenzsemantik sehe ich da eigentlich keinen Unterschied mehr zwischen Structs und Klassen.
Klar haben sie eine Exsistenzberechtigung (z.B. um mit DLL's die in anderen Sprachen geschrieben wurden zu kommunizieren) aber ansonsten sehe ich keinen wirklichen Vorteil
Das hat absolut nichts mit der Interaktion mit anderen Sprachen zu tun (C# Structs sind keine C Structs). Warum/wann man Structs haben wollen könnte? Eben dann, wenn man einen Valuetype möchte. Solche Objekte/Variablen landen auf dem Stack, werden kopiert (anstatt dass eine Referenz übergeben wird), können nicht den Wert null haben und logischerweise ist die standardmäßige Vergleichsmethode eben auch ein Vergleich des Objektinhalts anstatt der Referenz (== vergleicht die Werte der Felder des Objekts).
Wenn du solche Eigenschaften brauchst, nimmst du eine Struct. Im Grunde nimmt man das, um eigene "primitive" Typen zu definieren (Guid ist z.B. eine Struct).
08/03/2015 10:12 Mostey#138
Quote:
Originally Posted by MrSm!th View Post
Das hat absolut nichts mit der Interaktion mit anderen Sprachen zu tun (C# Structs sind keine C Structs).
Stimmt zwar aber er hat auch nicht behauptet, dass es C Structs wären. Es ist oft der Fall, dass durch C Libs die man über PInvoke mit .NET called ein Pointer auf eine von dir definierte Structinstanz entweder übergeben werden muss oder du einen Pointer auf eine Instanz erhälst. Dafür marshallt man ja die Instanzen auch, dann wird das C# struct auch unmanaged nutzbar und umgekehrt. Also in diesem Sinne kann man schon verstehen, wieso C# Structs in dieser Verbindung als C Structs angesehen werden können.


Quote:
Originally Posted by MrSm!th View Post
Warum/wann man Structs haben wollen könnte? Eben dann, wenn man einen Valuetype möchte. Solche Objekte/Variablen landen auf dem Stack, werden kopiert (anstatt dass eine Referenz übergeben wird), können nicht den Wert null haben und logischerweise ist die standardmäßige Vergleichsmethode eben auch ein Vergleich des Objektinhalts anstatt der Referenz (== vergleicht die Werte der Felder des Objekts).
Wenn du solche Eigenschaften brauchst, nimmst du eine Struct. Im Grunde nimmt man das, um eigene "primitive" Typen zu definieren (Guid ist z.B. eine Struct).

Man sollte auch immer bedenken, dass eine Klasse sich dafür genauso gut eignen kann. In der Performance teilweise auch nahezu immer geeigneter wie ein Struct wenn es um normale Nutzung geht und man nicht nur ein Feld/Prop darin hat, vor allem wenn du irgendwie Listen oder Arrays darin hättest. Aber das hängt natürlich alles vom Anwendungsfall ab, pauschal kann man das eh nicht sagen.

Überladen könnte man dann auch Equals und/oder operator==/operator!= um zu checken ob ein Objekt gleich ist. Objekte landen, so mein letzter Stand, dann auch nicht immer auf dem Heap. Da spielen noch andere Faktoren neben dem Scope ne Rolle.
08/03/2015 17:52 MrSm!th#139
Quote:
Stimmt zwar aber er hat auch nicht behauptet, dass es C Structs wären. Es ist oft der Fall, dass durch C Libs die man über PInvoke mit .NET called ein Pointer auf eine von dir definierte Structinstanz entweder übergeben werden muss oder du einen Pointer auf eine Instanz erhälst. Dafür marshallt man ja die Instanzen auch, dann wird das C# struct auch unmanaged nutzbar und umgekehrt. Also in diesem Sinne kann man schon verstehen, wieso C# Structs in dieser Verbindung als C Structs angesehen werden können.
Das war mir schon bewusst, aber tatsächlich hatte ich vergessen, dass Klassen für Marshalling nicht verwendet werden, sondern nur Structs. Insofern stimmt schon, da kann man Interop definitiv als Anwendungsfall von Structs zählen.

Quote:
Man sollte auch immer bedenken, dass eine Klasse sich dafür genauso gut eignen kann. In der Performance teilweise auch nahezu immer geeigneter wie ein Struct wenn es um normale Nutzung geht und man nicht nur ein Feld/Prop darin hat, vor allem wenn du irgendwie Listen oder Arrays darin hättest. Aber das hängt natürlich alles vom Anwendungsfall ab, pauschal kann man das eh nicht sagen.
Nein, eine Klasse kann dafür nicht herhalten, wenn ich einen Valuetype und dessen Semantik möchte. Natürlich sollte man vorher sicherstellen, dass man wirklich einen Valuetype möchte und nicht nur eine Klasse mit überladenem == Operator.
08/03/2015 18:00 Mostey#140
Quote:
Originally Posted by MrSm!th View Post
Nein, eine Klasse kann dafür nicht herhalten, wenn ich einen Valuetype und dessen Semantik möchte.
Ich bezog mich aber vorher nicht auf die Semantik bzw. die Tatsache, dass man Instanzen davon auf null setzen kann sondern viel eher auf den inhaltlichen Vergleich, der bei dir bei Klassen gar nicht erwähnt wurde.


Ist natürlich klar dass es keinen Sinn macht, ne Klasse zu nehmen wenn man sowieso nichts per Referenz übergeben möchte aber wann hat man das schon? Recht selten, wie ich finde.
08/03/2015 19:23 MrSm!th#141
Wenn ich einen primitiven Typ wie z.B. Guid implementieren möchte. Die Häufigkeit spielt doch keine Rolle. Ich habe einfach nur geschrieben, in welchen Situationen man Structs brauchen könnte.

Quote:
Ich bezog mich aber vorher nicht auf die Semantik bzw. die Tatsache, dass man Instanzen davon auf null setzen kann sondern viel eher auf den inhaltlichen Vergleich, der bei dir bei Klassen gar nicht erwähnt wurde.
Das ist ein Aspekt von mehreren in der Liste und ich sprach von der standardmäßigen Vergleichsoperation. Natürlich kann man auch den Operator == überladen, aber darum ging es nicht.
08/03/2015 22:19 Tarissuis#142
Hey, ich wollte keinen extra Thread öffnen (um mich nicht direkt als Noob zu outen :D), aber ich habe vor kurzem angefangen, mit einem C++ 3d modelling SDK (in meinem Fall FBX) zu arbeiten. Falls jemand von euch schon damit oder etwas ähnlichem gearbeitet hat und ein wenig Zeit über hat, würde ich mich über ein paar Tips freuen, am besten per Skype (Addy siehe Profil) :)
Kenntnisstand ist leider relativ jämmerlich und bisher habe ich noch kein gutes Script zu dem Thema gefunden. Links zu solchen wären also auch klasse!

Grüße
Tari
08/03/2015 22:57 Logtetsch#143
Für das Autodesk FBX SDK gibt es doch eine Dokumentation → [Only registered and activated users can see links. Click Here To Register...]
08/03/2015 23:53 Kizuaki#144
Oki Jungs, mich würde mal interessieren, wie ihr zu eurem Coding-Wissen gekommen seid, bzw. was euch dazu motiviert hat, eine Programmierersprache zu erlernen.

Habt ihr euch, wie hier alle immer empfehlen, ein Buch gekauft und euer Gehirn dann ein paar Stunden lang mit den Codes Basics vollgepumpt, oder habt ihr euch dieses Wissen in eurer schulischen Karriere angeeignet?

Fänd's echt korrekt, wenn mir jemand antworten würde :)
08/04/2015 00:35 Syc#145
Bücher, entsprechend üben und halt mit einigen mehr oder weniger kleinen Projekten einarbeiten.
08/04/2015 00:38 Reav0r#146
Quote:
Originally Posted by Kizuaki View Post
Oki Jungs, mich würde mal interessieren, wie ihr zu eurem Coding-Wissen gekommen seid, bzw. was euch dazu motiviert hat, eine Programmierersprache zu erlernen.

Habt ihr euch, wie hier alle immer empfehlen, ein Buch gekauft und euer Gehirn dann ein paar Stunden lang mit den Codes Basics vollgepumpt, oder habt ihr euch dieses Wissen in eurer schulischen Karriere angeeignet?

Fänd's echt korrekt, wenn mir jemand antworten würde :)
Also mein Wissen (wenn auch bei weitem nicht aus ausgereift wie z.B. wie die Kenntnisse von snow und einigen anderen hier) habe ich mir größten Teils selber angeeignet. Habe mir das ein oder andere Buch gekauft, viel ausprobiert und auch die ein oder andere Tutorial-Reihe angeschaut/gelesen.
Angefangen hat das ganze eigentlich mit dem Interesse an der Entwicklung von Flyff PServern, das ist aber schnell einem reinen Interesse am lernen von Programmier-Konzepten bzw. dem Programmieren an sich gewichen. Nun das wichtigste ist eigentlich das man jeden Tag dran bleib und immer was macht. Also nicht aufgeben. Den Fehler habe ich leider viel zu oft gemacht, das ich angefangen habe etwas zu lernen und dann iwann aufgegeben hab, weil es mir nicht schnell genug ging oder mir dann was anderes besser gefiel und so weiter. Bereue ich heute sehr. Also such dir direkt am Anfang etwas aus auf das du hinarbeiten möchtest um dich selber motiviert zu halten. Wenn du dich dann durchbeißt solltest du es sicher schaffen :)
08/04/2015 00:42 algernong#147
Ich hab in phpBB2 Foren Mods mit C&P rein kopiert, mir im Chat irgendwann erklären lassen, was ich da eigentlich so rein kopiere, dann irgendwann selber etwas probiert Code zu schreiben, eben mit dem, was ich bis dato kannte. Funktionen kannte ich zum Beispiel nicht, deswegen habe ich mehrfachen Code immer mit include() eingebunden. Irgendwann habe ich dann ein Buch gekauft und überflogen, das hat dann noch dabei geholfen Lücken zu schließen.
Wenn ich jetzt aber irgendeine neue Sprache lernen möchte schaue ich immer nach Büchern. Ich finde das komfortabler, wenn man sich nicht alles selber zusammen suchen muss, und was man schon kennt kann man ja überfliegen.
Ich habe zum Beispiel das Buch gelesen ( [Only registered and activated users can see links. Click Here To Register...] ), und hätte es schon enorm lästig gefunden, mir alles was darin steht irgendwie im Netz zusammen suchen zu müssen (früher war die Doku auf developer.gnome.org noch nicht so gut wie jetzt).
08/04/2015 07:09 Serraniel#148
In der 7. Klasse Pascal gelernt im Informatikunterricht ein Jahr lang. Dann in den Sommerferien nen Programmierkurs für Schüler an der FH teilgenommen. Dieser ging eine Woche und hat Visual Basic behandelt. Das dann joa so gut 3 Jahre beherrscht und reines learning by doing. Bots für Darkorbit gemacht. Später dann zu C# gewechselt. Seitdem hab ich in der Schule noch (Berufsschule mit Schwerpunkt Informatik gewechselt) C, Java PHP, MySQL und Batch gemacht.
Jetzt nächstes Semester hab ich nen C++ Modul an der Uni. Auf der Arbeit entwickeln wir in Delphi. JS ist bei mir als ich mich Richtung web entwickelt habe privat auch noch dazu gekommen.

Nachdem Informatik Jahr in der 7. Klasse (kann auch 6. gewesen sein, weiß ich nicht mehr) stand für mich fest, dass ich das machen will.
08/04/2015 11:43 Dantox#149
Überwiegend durch Tutorials und dann halt learning by doing. Hilfestellung war sehr oft stackoverflow, wo man echt zu fast jeder Frage 'ne Antwort findet. Ansonsten war/ist meine Motivation die App-Entwicklung für Smartphones.
08/04/2015 12:13 warfley#150
Quote:
Originally Posted by Kizuaki View Post
Oki Jungs, mich würde mal interessieren, wie ihr zu eurem Coding-Wissen gekommen seid, bzw. was euch dazu motiviert hat, eine Programmierersprache zu erlernen.

Habt ihr euch, wie hier alle immer empfehlen, ein Buch gekauft und euer Gehirn dann ein paar Stunden lang mit den Codes Basics vollgepumpt, oder habt ihr euch dieses Wissen in eurer schulischen Karriere angeeignet?

Fänd's echt korrekt, wenn mir jemand antworten würde :)
Habe damals mit mit 8 mich mal mit mit meinem Dad (selbst Informatiker) unterhalten, der hatte mir damals ein Delphi Buch gekauft. Habe es aber nicht sehr stark verfolgt, mit 11-12 habe ich dann noch einen versuch gewagt, da ich allerdings die CD aus dem Buch nicht mehr gefunden habe und kein Delphi mehr hatte habe ich zum Kostenlosen VB gewechselt, da das Syntaktisch ähnlich ist. Dann habe ich VB 2 Jahre verfolgt vor allem mit Tutorials z.B. von Microsoft, bis ich wieder D7 gefunden habe und habe bin ich wieder mit Delphi angefangen und das auch Intensiv mit dem Buch, im Unterricht (ab der 11 Klasse dann) und durch Internet (vor allem Freepascal Wiki als ich dann auf Freepascal umgestiegen bin).

Im Studium habe ich dann noch einige Technischen Grundlagen über Betriebsysteme und Architekturen gelernt.

Ich kann sagen dass ich mit den Tutorials und VB mir einen sehr sehr schlechten Programmierstil angeeignet habe, grade bei der Umstellung auf Delphi ist mir das extrem aufgefallen, da diese Sprache ja extrem strikt ist.
Über z.B. das Freepascal wiki bekommt man viel wissen grade auf Technischer ebene über Datentypen und Speicher etc.

Mittlerweile würde ich sagen ich kann recht solide programmieren und habe Fundiertes Grundwissen grade was Pascal angeht.