|
You last visited: Today at 14:50
Advertisement
Coders Chit-Chat
Discussion on Coders Chit-Chat within the General Coding forum part of the Coders Den category.
08/02/2015, 21:14
|
#136
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
Quote:
Originally Posted by warfley
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
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
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
|

tltr?; Ich habs auch noch nicht gelesen.
|
|
|
08/03/2015, 02:51
|
#137
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
Originally Posted by Logtetsch
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
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
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
|
#138
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Quote:
Originally Posted by MrSm!th
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
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
|
#139
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
|
#140
|
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
|
Quote:
Originally Posted by MrSm!th
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
|
#141
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
|
#142
|
elite*gold: 2470
Join Date: Jul 2010
Posts: 7,524
Received Thanks: 5,444
|
Hey, ich wollte keinen extra Thread öffnen (um mich nicht direkt als Noob zu outen  ), 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
|
#143
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
Für das Autodesk FBX SDK gibt es doch eine Dokumentation →
|
|
|
08/03/2015, 23:53
|
#144
|
elite*gold: 0
Join Date: Jan 2011
Posts: 1,048
Received Thanks: 189
|
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
|
#145
|
elite*gold: 666
Join Date: Apr 2011
Posts: 5,810
Received Thanks: 2,418
|
Bücher, entsprechend üben und halt mit einigen mehr oder weniger kleinen Projekten einarbeiten.
|
|
|
08/04/2015, 00:38
|
#146
|
elite*gold: 0
Join Date: Sep 2014
Posts: 150
Received Thanks: 32
|
Quote:
Originally Posted by Kizuaki
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
|
#147
|
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 444
|
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 (  ), 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
|
#148
|
elite*gold: 0
Join Date: May 2010
Posts: 6,853
Received Thanks: 5,106
|
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
|
#149
|
elite*gold: 0
Join Date: Jan 2012
Posts: 228
Received Thanks: 45
|
Ü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
|
#150
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
Quote:
Originally Posted by Kizuaki
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.
|
|
|
Similar Threads
|
CO 2 Chit-Chat
04/04/2013 - Conquer Online 2 - 3 Replies
Hello,
You are allowed to talk in this thread about all things belonging to CO2.
It does not matter whether you want to ask something or you just want to talk about CO2.
Posts like "lol" are forbidden!
|
All times are GMT +1. The time now is 14:52.
|
|