Verständnissfrage zum C# Einstieg

  • C#

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Verständnissfrage zum C# Einstieg

    Guten Abend werte Community.

    ich habe mich frisch angemeldet, da ich die erste Verständnissfrage habe, was das Thema C# anbetrifft.
    Ich arbeite seid 2 Tagen mit dem Buch "Einstieg in Visual C# 2019" von Thomas Theis.

    Beim Thema Datentypen bin ich auf folgende Frage getroffen. Es soll ein Beispiel Projekt erstellt werden
    welches Name, adresse etc ausgeben soll. Soweit so gut. Dann hab ich mir das Beispiel dazu angesehen
    und mir stellte sich die Frage bei der Variable alter. Ich hatte davor gelesen, man solle sich Gedanken
    machen welchen Datentypen man nimmt wegen speicherverbrauch. Nun hab ich überlegt, Alter kann kaum 3 stellig werden, also
    nimmst den Datentyp byte. Jetzt schau ich mir das Beispiel an und dort wird int als Datentyp genommen.

    Gibt es dafür nen bestimmte Grund? int nimmt 4 byte und byte nur 1 byte speicher.

    Danke schonmal für Antworten
    Solange du nicht hingehst und Millionen solcher Datensätze auf einmal im RAM hast, musst du dir um einzelne Bytes an Unterschied normalerweise keine Gedanken machen. Deine Frage ist aber generell absolut berechtigt und das Buch ist da aus meiner Sicht etwas komisch, wenn sie erst sagen, dass man auf den Speicherverbrauch achten soll und es dann selbst an einer Stelle, wo es durchaus relativ einfach wäre, da diese Optimierung zu treffen, nicht machen. Und du hast natürlich Recht, wenn du nur ein Alter in Jahren darstellen willst, ist ein Byte absolut richtig, solange deine Menschen, die du darstellen willst, alle lebendig sind und du nicht das heutige Alter von Beethoven etc. darstellen willst.
    Willkommen im Forum. :thumbup:

    Icey83 schrieb:

    int nimmt 4 byte und byte nur 1 byte speicher.
    Speicherverbrauch in einstelligen Byte-Anzahlen zu zählen ist Humbug.
    Mit an Sicherheit grenzender Wahrscheinlichkeit wird Deine Byte-Variable in 4 Byte RAM und 4 Byte Festpaltte abgelegt, es sei denn, Du programmierest es explizit anders.
    Das liegt am Speicher-Zugriff der CPU auf den RAM.
    int ist ein sehr angenehmer Datedntyp, viele Daten werden zur Verrechnung nach int konvertiert.
    int als Typ für eine Variable für das Alter von was auch immer ist absolut in Ordnung. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat eines direkten Vorposts durch Anredefunktion ersetzt ~VaporiZed

    @nafets:
    Danke für die Antwort. Nehmen wir mal an, ich stelle 1000 Mitarbeiter mit Alter dar. Da wird es doch schon nen Unterschied machen, ob ich nen byte oder 4 byte speicher nutze. Schon wegen der Performence denke ich.

    Fast-Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Also int als standart Datentyp für alle Zahlen im Wertebereich benutzen versteh ich das richtig, da es umgewandelt wird?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“ ()

    Hi @Icey83
    Wenn wir schon dabei sind, kann man sich immer wundern, warum int genommen wird. Int ist auch der Datentyp für eine Bildbreite /-höhe, obwohl die ja gar nicht an sich negativ sein kann. Wie auch immer, heutige Systeme verarbeiten int am besten. Bzw es ist einfacher im Code, überall int stehen zu haben.
    Zu deiner Frage: Es kommt auf die Differenz an. Der Unterschied zwischen byte und Int sind 3 Bytes. Klar, bei Millionen merkst du eine RAM-Belastung (siehe Diagnosetools in Visual Studio). Aber bei wenigen Variablen ist das unbedenklich.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    Zu deiner ersten Frage: Jein - in der Praxis wird der Performanceunterschied bei dieser Anzahl an Mitarbeitern trotzdem kaum messbar sein. Generell ist es für die Performance oft wenig ausschlaggebend, wie viel Arbeitsspeicher du verwendest - problematisch wird es in den meisten Fällen erst, wenn du einen signifikanten Anteil des freien Arbeitsspeichers verwendest, weil dann der Arbeitsspeicher irgendwann voll wird, was man vermeiden sollte (1000 * 4 Byte sind da aber quasi irrelevant - das sind ja lediglich 4 Kilobyte, während Arbeitsspeicher ja in der Größenordnung Gigabyte, also eine Million mal größer, ist). Für die Performancefrage kann man es eventuell so relativ anschaulich erklären: In den/aus dem Arbeitsspeicher kann mit einigen Gigabyte pro Sekunde gelesen und geschrieben werden. Wenn wir also von einem Unterschied von 3 Kilobyte reden, wird der Pi mal Daumen erst relevant, wenn du eine Million Mal pro Sekunde (d.h. zum Beispiel 1000 Mal pro Sekunde auf die Alter von 1000 Mitarbeitern - da wärst du dann ca. bei einem zehntausendstel der Performance vom Arbeitsspeicher) auf diese Daten zugreifst, weil du dann ungefähr in die Richtung Größenordnung der Geschwindigkeit des RAM kommst (vermutlich schon eine Größenordnung davor messbar, aber bei drei Größenordnungen davor ist es fast immer vernachlässigbar).

    Zu der zweiten Frage: Ja, int ist der absolute Standarddatentyp für Zahlen - groß genug, um die meisten Anwendungsfälle locker mit jede Menge Puffer abzudecken und trotzdem klein genug, dass es nicht übermäßig viel RAM verbraucht (wobei das heutzutage auch erst eigentlich viel später ein Problem wird). Speziell hilfreich im Vergleich zum Byte vorher ist noch, dass int auch negative Zahlen kann - je nachdem ist das manchmal praktisch, wenn man dann anfängt, mit Differenzen zu rechnen.

    Nachtrag noch zur zweiten Frage: Im Arbeitspeicher wird ein byte nicht zu einem int umgewandelt. Was aber oft vorkommt ist, dass aus diversen Gründen Arbeitsspeicher unterteilt wird: Dabei kann es bspw. sein, dass generell jede Variable in Blöcken mit je mindestens 4 Byte Speicherplatz abgelegt wird, womit der Arbeitsspeicherverbrauch von einem byte und einem int gleich ist - ein long würde natürlich trotzdem 2 * 4 Byte belegen. In manchen Fällen wie beispielsweise Arrays (byte[]) ist das Ganze effizienter abgelegt - dort könnten dann auch mehrere byte-Einträge direkt hintereinander im RAM stehen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „nafets“ ()

    Icey83 schrieb:

    ich arbeite seid 2 Tagen mit dem Buch "Einstieg in Visual C# 2019" von Thomas Theis.
    Ouh - das ist heikel.
    In VisualBasic hat der ein absolut unterirdisch grottenschlechtes Buch geschrieben, einen echten Anfänger-Verderber.
    Ich wusste garnet, dass man den nu auch auf c# losgelassen hat.
    Wenn du diese Byte-sparsamkeits-Idee zufällig aus diesem Buch hast - das würd zu ihm passen.

    Also wichtig: Nimm irgendein anderes Buch. Ich hab bischen rumgeguckt bei Büchern, ich fand im allgemeinen c#-Bücher qualitativ ok. Auch weil man in c# von vornherein garnet soviel Unfug anstellen kann wie in VisualBasic.
    Aber Thomas Theiss - absolute Vorsicht, bzw. eher lieber nicht, und auf keinen Fall als einziges Buch.

    Anfänger-Verderber sind überhaupt nicht harmlos: Wenn du später mit solchen Opfern in Foren diskutierst, kannst du seitenweise über die banalsten Grundsätze debattieren - es ist eine mords-Ackerei, derlei Anfänger-Unfug wieder aus die Köpfe rauszuboxen.
    Etwa diesen Unfug, Datentypen nach Byte-Breite auszusuchen.
    Datentypen sucht man nach Zweck aus. Aber schon bei einer Variable alter kriege ich Zuckungen, weil kein Mensch mit IQ über 25 würde das Alter einer Person abspeichern wollen - das ändert sich doch stündlich!
    Selbstverständlich speichert man den Geburtstag ab, und da verwendet man den Datentyp DateTime - nichts anderes (naja, oder DateTimeOffset, wenn man mit Zeitzonen herumhampelt).

    Aber vmtl. gehts garnet um abspeichern, sonder einfach um eine Variable wie du sagst. Wie gesagt: deren Breite ist uninteressant, weil nur eine Variable - es kann ja garnet vorkommen, dass 2 Millionen davon im Speicher rumfahren - sowas ist ja nur bei abgespeicherten und geladenen Dingen möglich.

    An einer einzelnen Variable kannst du 3, 7, 15, 100 Bytes sparen - das ist so wie überlegen, ob man lieber ein Proton oder ein Neutron mit in die Waagschale werfen sollte.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Schon bei einer Variable alter kriege ich Zuckungen, weil kein Mensch mit IQ über 25 würde das Alter einer Person abspeichern wollen - das ändert sich doch stündlich!
    Selbstverständlich speichert man den Geburtstag ab, und da verwendet man den Datentyp DateTime - nichts anderes.
    Dem kann ich nur beipflichten.
    Genau das war nämlich auch mein erster Gedanke.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Icey83 schrieb:

    Nehmen wir mal an, ich stelle 1000 Mitarbeiter mit Alter dar. Da wird es doch schon nen Unterschied machen, ob ich nen byte oder 4 byte speicher nutze. Schon wegen der Performence denke ich.

    Auf den heutige Rechnern ist das egal, sowohl beim Platzbedarf als auch bei der Geschwindigkeit.
    Vor 35 Jahren war das anders. Da hatte man noch um jedes Byte gekämpft. :)
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Da ich nicht wegen jedem kleinen ... nen neuen Thread eröffnen möchte, weil nicht gern gesehen, werde ich wenn es ok ist meine Fragen hier
    weiter stellen. Ich hab jetzt das Thema logische operatoren und ich glaube ich interpretiere hier was falsch.
    Ich habe folgenden Code

    Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. bool ergebnis = (4 > 3) && (-4 > -3);
    4. label1.Text = ergebnis.ToString();
    5. }
    6. private void button2_Click(object sender, EventArgs e)
    7. {
    8. bool ergebnis = (4 > 3) || (-4 > -3);
    9. label2.Text = ergebnis.ToString();
    10. }


    Warum kommt in der ersten Methode nicht true raus und bei der 2. True?

    Und ja ich war zu faul, jedesmal aufs neue die button und label neu zu benennen.
    Das ergebnis gibt in Z#3 true, wenn 4 > 3 (wahr) ist und -4 > -3 (wahr) ist. Da die zweite Bedingung aber falsch ist, ist das gesamte Ergebnis falsch.
    Das ergebnis gibt in Z#10 true, wenn 4 > 3 (wahr) ist oder -4 > -3 (wahr) ist. Dass die zweite Bedingung falsch ist, ist unwichtig, da die erste Bedingung bereits wahr ist. Daher wird die 2. Bedingung gar nicht mehr geprüft.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Icey83 schrieb:

    Da ich nicht wegen jedem kleinen ... nen neuen Thread eröffnen möchte, weil nicht gern gesehen, ...

    Da irrst du dich, hier ist es üblich und erwünscht, für jedes Thema, einen eigenen, mit einem aussagekräftigem Titel versehenden, Thread zu eröffnen.
    (Zu viele Kommata ?( )