Announcement

Collapse
No announcement yet.

Anfängerfrage; wie wird "string" intern gespeichert? C#

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anfängerfrage; wie wird "string" intern gespeichert? C#

    Hallo

    Ich habe ein kleines Problem, bei dem ich einfach nicht voran komme.
    Ich habe großes Interesse an "C#" und mir ein neues Buch gekauft, bin allerdings noch ganz am Anfang.

    Ich komme an einer Stelle im Buch nicht weiter!
    Zitat;

    char beschränkt sich auf ein Zeichen. Um eine Zeichenkette, die sich aus keinem oder bis zu maximal ca. 2^31(2 hoch 31) Einzelzeichen zusammensetzt, zu speichern oder zu bearbeiten, deklarieren Sie eine Variable vom Datentyp string. Die Einzelzeichen werden dabei wie bei char als Unicode-Zeichen der Größe 16 Bit behandelt.

    Meine Frage er gibt sich daraus, das ich nicht genau weis wie hier 2^31(2 hoch 31) zustande kommt.
    4 Byte ergeben ja 32 Bit. Der Index beginnt immer bei Null (0). Liegt es daran?
    Liegt es an dem "Einer- Zweierkomplement?
    Ich stehe mega auf dem Schlauch und je weiter ich versuche das "Rätzel" zu lösen, verwirre ich mich nur um so mehr.
    Ich kann aber nicht weiter machen bevor ich's nicht verstehe.
    Warum 2^31 (2 hoch 31)?

    Würde mich über Antwort freuen
    Grüzze gehen raus

  • #2
    32 Bit= Bits 0-31

    Christian

    Comment


    • #3
      Stelle dir einen string als Array von char vor (in der Hoffnung du hast schon eine Vorstellung was ein Array is). Ein Array hat die Eigenschaft das ich jeden seiner Inhalte direkt über seine Position ansprechen kann. Ich kann also auch in jedem string ein Zeichen an einer beliebigen Position auslesen. Jetzt kommt so ein wenig Historie. Bei solchen Dingen muss man sich auf irgendwas einigen mit welchem Datentyp man diesen Zugriff macht zu kleiner Datentyp ist blöd und zu groß ist ebenso blöd weil dann Erwartungen geweckt werden das das auch bis in diese Größe sinnvoll funktionieren kann. Im Net.Framework (nicht C#, hier muß man Framework und Sprache ein wenig unterscheiden) hat man sich beim Design auf den Datentyp int (32 bit) geeinigt. Da das eine Framework Entscheidung ist und keine der Sprache ist muss man sich auf etwas einigen was auf allen angedachten Sprache funktioniert. Und es gibt Sprachen die auf dem Framework laufen und keine vorzeichenlosen Datentypen kennen. Darum ist der Datentyp zum Indexieren in Arrays ein vorzeichenbehafteter Typ obwohl negative Werte da keinen Sinn machen. Das ist eigentlich im gesamten Framework so. Du wirst oft über Methoden stolpern die eine int/long Parameter annehmen obwohl negative Werte hier keinen Sinn machen. Nichts das im Framework sprachübergreifend genutzt werden soll hat einen Zahlentyp ohne Vorzeichen (einen signed Typ). Daraus das nur positive Zahlen hier Sinn machen ergibt sich bei einem 32bit Datentyp das sich der nutzbare Zahlenraum halbiert aka 1 bit nicht nutzbar ist (man könnte behaupten das das das Vorzeichen bit ist). Dadurch das ich nur 2^31 Zeichen ansprechen kann ist die Länge eines strings begrenzt also eher aus designtechnischen Gründen und nicht aus realen technischen Gründen die an der benutzten Hardware oder dem darunterliegenden Betriebssystem hängen.

      Comment


      • #4
        Hallo,

        aus realen technischen Gründen die an der benutzten Hardware oder dem darunterliegenden Betriebssystem hängen.
        Auch noch ein wenig Historie: als .NET entworfen wurde, gab es hauptsächlich 32-bit Betriebssysteme / CPUs und 64-bit Systeme waren eher noch Zukunft. Daher hat sich 32-bit einfach "angeboten", mit der von Ralf erwähnten Einschränkung auf int.

        Ganz so einfach ist es nun aber auch wieder nicht, denn in .NET kann -- ohne weitere Konfiguration od. in .NET Core -- ein Objekt maximal 2 GB groß sein. D.h. die maximale Länge eines Strings ergibt sich aus (2 GB - Object-Header-Größe) / 2 byte (da ein char UTF-16 ist, somit aus 2 byte besteht).
        Wie erwähnt kann dieses Limit per Konfiguration "abgestellt" werden und in .NET Core ist dieses Limit nicht vorhanden, daher gilt das oben Erwähnte.

        Ein bischen technischere Lektüre dazu: Strings and the CLR - a Special Relationship.

        Aber lass dich von diesen technischen Feinheiten nicht allzusehr verwirren, denn in der Praxis ist das irrelevant. In den all den Jahren mit denen ich mit C# / .NET gearbeitet habe, bin ich nie auf so eine Limitierung gestoßen.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Mit dem "Lernen von C#" ist es nicht ganz so einfach: über die Jahre hinweg wurden seitens Microsoft Technologien / Vorgehensweisen / IDEs ... erfunden (und teilweise wieder abgekündigt), dass es selbst erfahreneren Entwicklern schwer fällt hier Schritt zu halten (wobei die Innovationen nicht immer positiver Natur sind). Und früher richtige Antworten in Bezug auf C# oder .NET können heute unvollständig oder gar komplett falsch sein. Siehe https://dusted.codes/dotnet-for-beginners für Weiteres.
          MfG
          Cheat-Sheets for Developers / Programming Quotes

          Comment

          Working...
          X