Daten Zuweisung zu Variablen
-
Hallo zusammen,
ich bin Anfänger was das Programmieren angeht und habe mal ein Paar grundsätzliche Fragen, beim Zuweisen von Variablen zum richtigen DatentypIch schreibe mal auf was ich denke und würde mich freuen, wenn das wer kommentieren könnte.
1.) Ist es richtig, dass 0,233566876 bis 1 zu einer Double gehören würde, da die Genauigkeit höher wie 7 ist? Bin mir da unsicher!
2.) 5,44 bis 100,6 würde ich auch einer Float zuweisen?!
3.) 0 bis 6*10Hoch 5 wäre aus meiner Sicht 0 - 600000 und das wiederrum wäre ein UINT, genauso wie 0 bis 4 * 10 Hoch 9 (=4000000000)
4.) 5,66 * 10 Hoch 40 bis 5,66 *10 hoch 50 würde ich einem Double zuweisen?
Würde mich freuen, wenn mir das mal wer bestätigt und falls ich falsch liege erklärt. KOmme da noch nicht so ganz klar mit und will nicht direkt am Anfang DInge falsch lernen.
Danke
Gruß
Tale
-
Also ich würd mal sagen, dass moderne PC's genug RAM haben um viele doubles und decimals etc zu speichern. Immerhin sind wir hier nicht in uController Bereich.
Es wird dir nur unnötig viel Zeit kosten für jede Variable auszurechnen wie viel Speicherplatz du genau brauchst. Wenn du aber riesige Datenmengen hast (Viele Messwerte, grosse Audiodaten, etc.) Macht es allerdings Sinn kurz zu überlegen welchen Datenbereich du abdecken willst.
Wenn du das Schlüsselwort 'var' statt 'double' oder 'int' verwendest, wird deine variable automatisch zugewiesen. Funktioniert übrigens auch beim instanzieren von Klassen.
Ich persönlich nehme immer var, ist am einfachstenGrüsse
Chiller
-
Talemantros schrieb:
1.) Ist es richtig, dass 0,233566876 bis 1 zu einer Double gehören würde, da die Genauigkeit höher wie 7 ist? Bin mir da unsicher!
Du kannst das auch zu einem float zuweisen, es wird dann halt etwas gerundet. Der Unterschied zwischen float und double liegt - wie du weißt - in der Genauigkeit und insofern ist die Wahl float vs double eine Wahl darüber, wie genau du Werte speichern möchtest.
2.) 5,44 bis 100,6 würde ich auch einer Float zuweisen?!
Ja, dafür reichen floats. Aber achte darauf, dass du nicht zum "RAM-Fuchser" wirst und dann einen wilden Mix aus float und double hast und ständig casten musst.
3.) 0 bis 6*10Hoch 5 wäre aus meiner Sicht 0 - 600000 und das wiederrum wäre ein UINT, genauso wie 0 bis 4 * 10 Hoch 9 (=4000000000)
Vorzeichenlose Integer sind eig. nicht sooo oft im Einsatz, aber ein UInt32 wäre passend (dann muss man natürlich 4000000000u bei der Zuweisung schreiben). Alternativ eben Int64.
4.) 5,66 * 10 Hoch 40 bis 5,66 *10 hoch 50 würde ich einem Double zuweisen?
Gleiche Antwort wie oben: Hängt davon ab, wie genu du es brauchst.
Noch ein Wort zum Thema var: var leitet den Datentyp eines Ausdrucks automatisch her. Man muss aber ein bisschen aufpassen, denn man bekommt dann mit var x = 4.5; immer ein double. Will man float, muss man schon var x = 4.5f; schreiben. Man darf also das Hirn beim Benutzen von var nicht komplett ausschalten. Ich pers. verfahre so: built-in Datentypen sowie string schreibe ich händisch hin. Bei Structs und Klassen verwende ich var.
-
Chiller schrieb:
Wenn du das Schlüsselwort 'var' statt 'double' oder 'int' verwendest, wird deine variable automatisch zugewiesen. Funktioniert übrigens auch beim instanzieren von Klassen.
Ja anhand des Wertes, mit dem initialisiert wird. Ist das auch der richtige Typ für nachfolgende Berechnungen?
Chiller schrieb:
Ich persönlich nehme immer var, ist am einfachsten
Das ist nicht Sinn und Zweck von var und trägt bestimmt nicht zur Lesbarkeit des Codes bei.
Hast Du dann auch solchen Code? var number = foo();
Zum Glück muss ich mich in sowas nicht einlesen.
Abseits anonymer Typen (wofür var entwickelt wurde), ist sowas nicht verkehrt:
var list = new List<string>();
Ansonsten lieber Hände weg davon und nicht unreflektiert überall einzusetzen, weil es angeblich einfacher ist.Talemantros schrieb:
Würde mich freuen, wenn mir das mal wer bestätigt und falls ich falsch liege erklärt. KOmme da noch nicht so ganz klar mit und will nicht direkt am Anfang DInge falsch lernen.
Es gibt keine in Stein gemeiselten Regeln, wann welcher Typ zu verwenden ist. So wahnsinnig viel Gedanken muss man sich meistens auch nicht darüber machen.
Stell Dir einfach solche und ähnliche Fragen: Reicht die Genauigkeit? Könnte es zu Überläufen kommen? Diktiert mir eine andere Komponente/API/Interface den Datentyp? Seltener: Ist Floating Point oder Fixed Point angebrachter?
Früher oder später und mit etwas Übung schreibst Du die Typen meistens einfach nieder ohne viele Gedanken daran verschwenden zu müssen. Denn: Im Desktop-Bereich haben wir wirklich keine Speicherprobleme mehr und für Ganzzahlen greife ich fast immer zu int, selbst wenn der Wertebereich voraussichtlich nicht ansatzweise ausgeschöpft wird.Bei großen Arrays denkt man dann etwas genauer darüber nach um keinen Speicher zu verschwenden. Z.B. diktiert ein Bitmap mit 8 Bit pro Farbkanal den Datentyp byte und es wäre Verschwendung hier ein int[] anzulegen.
-
µ schrieb:
Ja anhand des Wertes, mit dem initialisiert wird. Ist das auch der richtige Typ für nachfolgende Berechnungen?
Hmmm, im seltenen Fall, dass man tatsächlich etwas anderes als 'double' oder 'int' braucht, muss man das halt genau definieren, aber meistens reichen diese beiden für Berechnungen oder?
µ schrieb:
Das ist nicht Sinn und Zweck von var und trägt bestimmt nicht zur Lesbarkeit des Codes bei.
Hast Du dann auch solchen Code? var number = foo();Nö, dass dann doch nicht. Ich geb zu, das Wort 'immer' braucht noch ein 'fast' davor. Ich verwende ReSharper, der wandelt mir das Meiste in 'var' um.
Bei deinem Beispiel mit würde ich nur 'var' verwenden, wenn es eine bekannte Methode ist z.B. sring.Split(...).Grüsse
Chiller
-
Ich danke euch für eure Ausführungen.
Vielleicht eins noch, wo ist der Unterschied zwischenm Uint32 und Int64 wie oben beschrieben. Ich finde in meinem Buch nur Int und Uint
lg
Tale
-
Talemantros schrieb:
Vielleicht eins noch, wo ist der Unterschied zwischenm Uint32 und Int64 wie oben beschrieben. Ich finde in meinem Buch nur Int und Uint
System.UInt32 -> Vorzeichenlose (kann nur positive Zahlen darstellen) 32-bit Ganzzahl
System.Int64 -> Vorzeichenbehaftete (kann also negative und positive Zahlen darstellen) 64-bit GanzzahlSystem.UInt32 läuft normal als "uint" und System.Int64 als "long". Genauso wie float intern System.Single heißt etc.
-
µ schrieb:
Das ist nicht Sinn und Zweck von var und trägt bestimmt nicht zur Lesbarkeit des Codes bei.
Hast Du dann auch solchen Code? var number = foo();
Zum Glück muss ich mich in sowas nicht einlesen.
Abseits anonymer Typen (wofür var entwickelt wurde), ist sowas nicht verkehrt:
var list = new List<string>();
Ansonsten lieber Hände weg davon und nicht unreflektiert überall einzusetzen, weil es angeblich einfacher ist.Wozu willst du den Typ wissen? Der Typ ist meistens unnötig und für das Verständnis des Codes unwichtig. Viel wichtiger sind Variablen- und Funktionsnamen.
Eine ausführliche Auseinandersetzung mit dem Thema findest du z.B. hier:
http://blogs.msdn.com/b/ericlippert/archive/2011/04/20/uses-and-misuses-of-implicit-typing.aspxVielfach kann
var
das Verständnis des Codes verbessern, weil es unnötige Informationen entfernt. Wenn du auf den Typ angewiesen bist, dann stimmt meistens etwas in deiner Aufteilung oder Benennung des Codes nicht.Grüssli
-
Dravere schrieb:
Vielfach kann
var
das Verständnis des Codes verbessern, weil es unnötige Informationen entfernt. Wenn du auf den Typ angewiesen bist, dann stimmt meistens etwas in deiner Aufteilung oder Benennung des Codes nicht.Ich glaub das ist auch eine Frage, wie man selbst ins Programmieren reingewachsen ist. Ich z.B. bin ein großer Freund von statischen Typsystemen. Insofern bin ich damit aufgewachsen, den Typ hinzuschreiben und "var" war für mich am Anfang schon ganz schön komisch
Hat sich angefühlt, als ob man scripted :p Inzwischen nutze ich es aber auch häufig, gerade bei Klassen. Aber meine built-ins bleiben manuell ausgeschrieben
-
GPC schrieb:
Dravere schrieb:
Vielfach kann
var
das Verständnis des Codes verbessern, weil es unnötige Informationen entfernt. Wenn du auf den Typ angewiesen bist, dann stimmt meistens etwas in deiner Aufteilung oder Benennung des Codes nicht.Ich glaub das ist auch eine Frage, wie man selbst ins Programmieren reingewachsen ist. Ich z.B. bin ein großer Freund von statischen Typsystemen. Insofern bin ich damit aufgewachsen, den Typ hinzuschreiben und "var" war für mich am Anfang schon ganz schön komisch
Hat sich angefühlt, als ob man scripted :p Inzwischen nutze ich es aber auch häufig, gerade bei Klassen.
Naja, ich bin über VBA und dann vor allem C++ ins Programmieren reingekommen. In C++ hatte ich sogar am Anfang noch die microsoft'sche ungarische Notation verwendet. Ich bin allerdings schon vor C# mit
var
zur Überzeugung gelangt, dass der Typ einer Variable eher unwichtig ist. Das kam unteranderem durch Diskussionen über die ungarische Notation (auch hier im Forum) und durch die Templatemetaprogrammierung, wo es einfach sehr offensichtlich wurde, wie unwichtig der Typ ist im Gegensatz zu Variablennamen und der Schnittstelle eines Typs, heisst den Funktionsnamen.GPC schrieb:
Aber meine built-ins bleiben manuell ausgeschrieben
Kommt bei mir ganz darauf an. Zum Beispiel
string
ersetze ich fast überall durchvar
. Bei den Zahlentypen kommt es ganz darauf an, was ich mache. Solange der Typ aber nicht wichtig ist, nehme ich meistensvar
.Grüssli
-
Das Verständnis von Code ist so subjektiv, dass sich darüber eigentlich nicht diskutieren lässt. Außerdem scheint es mir hochgradig abhängig von der Art Code/Software zu sein, ob var nützlich oder böse ist.
Tatsächlich schreibe ich auch häufig sowas:
var studyRepository = repositoryFactory.getStudyRepository();
Also bei anwendungsweiten Serviceklassen ist mir der Typ egal, weil die Benennung immer identisch und die Anwendung einfach und stets im Gedächtnis ist.
Aber die bedinungslose und durchgehende Verwendung von var halte ich für schlichtweg falsch. Insbesondere bei Teamarbeit. Gegen bewussten Einsatz habe ich nichts.Sobald der Code schwieriger wird, ist mir die Typinformation ein Hilfsmittel zum Verständnis. Auch als Anker ins Gedächtnis um mich an Details der Typen zu erinnern. Abseits von Datenschubser-Anwendungen ist es manchmal eben überhaupt nicht egal, wie ein Typ intern funktioniert und jedes Stück Information, dass mir Quellcode auf den ersten Blick liefert, von Bedeutung.
(Btw. warum schreit die C++-Gemeinde nach Concepts, wenn die Details eine Templateparameters so unwichtig sind und der Compiler den Rest schon erledigt? Imho nicht nur für verständlichere Compilerausgaben.)
Dravere schrieb:
Wenn du auf den Typ angewiesen bist, dann stimmt meistens etwas in deiner Aufteilung oder Benennung des Codes nicht.
Sorry aber das ist nur ein Totschlagargument, wie man es in dieser oder ähnlicher Form ("Mit dem Design stimmt etwas nicht") leider sehr oft liest.
-
Mich würde noch interessieren, wie es mit einem Langzeittest aussieht. Also falls jemand var seit längerem (>=1 Jahr) überall oder nahezu überall, wo möglich, verwendet: Wie steht es um die nachträgliche Verständlichkeit von älterem Codes bei Wartungsarbeiten? Also Code der nicht mehr im Gedächtnis ist.
Edit: Ich kann heute keinen geraden Satz mehr formulieren
-
µ schrieb:
...Außerdem scheint es mir hochgradig abhängig von der Art Code/Software zu sein, ob var nützlich oder böse ist.
Wenn man wie ich unter C# eher kurze Methoden schreibt ist var eigentlich unproblematisch. Ich selbst verwende var (bzw. überlasse Resharper die Konvertierung) bei nicht eingebauten Datentypen, int/bool... schreibe ich aus.
µ schrieb:
...Aber die bedinungslose und durchgehende Verwendung von var halte ich für schlichtweg falsch. Insbesondere bei Teamarbeit.
Auch bei Teamarbeit kann man mit sinnvoller Benennung und tendenziell kurzen Methoden var relativ problemlos einsetzen. Zumal mir der Typ ohnehin angezeigt wird (oder liegt dies am Resharper?).
-
asc schrieb:
µ schrieb:
...Aber die bedinungslose und durchgehende Verwendung von var halte ich für schlichtweg falsch. Insbesondere bei Teamarbeit.
Auch bei Teamarbeit kann man mit sinnvoller Benennung und tendenziell kurzen Methoden var relativ problemlos einsetzen. Zumal mir der Typ ohnehin angezeigt wird (oder liegt dies am Resharper?).
Hier wird irgendwie implizit unterstellt, dass die Benennung bei var-Gegnern (drastisch formuliert, ich verwende es ja teilweise auch), entweder nicht ernst genommen oder nicht gut ist. Ich gebe mir große Mühe bei den Bezeichnern und nach einigen Jahren glaube ich auch dass sie mir gelingen.
Andere Sache: Wenn die Benennung bei massivem Einsatz von impliziter Typisierung soweit geht, dass der Typ am Ende wieder in dem Bezeichner auftaucht, hat man es imho übertrieben.List<string> names = getNames();
oder
var namesList = getNames();Btw. welcher angezeigte Name meinst Du? Also wie sieht das mit Resharper aus?
-
µ schrieb:
List<string> names = getNames();
oder
var namesList = getNames();Ich muss zugeben, die Bezeichnung fooList/fooSequence findet man bei mir oft, weil wenn ich es nur z.B. "names" nenne und hinterher mit foreach drübergehe, dann muss ich ja foreach (var name in names) schreiben und es nervt mich, dass sich die Liste und der einzelne String vom Namen her nur an dem 's' unterscheiden. Da kann ich IntelliSense auch nicht mehr so effektiv nutzen