Auf das Thema antworten  [ 1 Beitrag ] 
UInt24 struct Bibliothek 
Autor Nachricht
Administrator
Benutzeravatar

Registriert: Sa 15. Dez 2012, 19:15
Beiträge: 137
Wohnort: Karlsruhe
Mit Zitat antworten
Hallo Leute!

Bei der Auswahl des Datentyps in einer MySQL-Datenbank kann man viel Speicherplatz sparen, wenn man die Wertebereiche der Datentypen kennt und sie optimal nutzt.

Da es in MySQL den Datentyp MEDIUMINT gibt und in C# nicht, habe ich eine Bibliothek geschrieben die eine Zahl zwischen 0 und 16.777.215 in drei Bytes speichern kann. Die Schnittstelle IComparable ist eingebaut sowie das Operatoren +, -, *, /, ==, !=, <, >, <=, >=, ++, --. Außerdem gibt es eine Methode um die Bytes an einen System.IO.BinaryWriter weiterzugeben und eine Methode um eine UInt24 aus einem System.IO.BinaryReader zu lesen und um den Byte-Array der UInt24 zurückzubekommen, sowie die Möglichkeit den Wert in einen string zu speichern und aus einem string zurück zu konvertieren.

Explizite Operatoren:
  • UInt24 -> byte
  • UInt24 -> sbyte
  • UInt24 -> short
  • UInt24 -> ushort
  • uint -> UInt24
  • long -> UInt24
  • ulong -> UInt24
  • float -> UInt24
  • double -> UInt24
  • decimal -> UInt24

Implizierte Operatoren:
  • UInt24 -> int (Int32)
  • UInt24 -> uint
  • UInt24 -> long
  • UInt24 -> ulong
  • UInt24 -> float
  • UInt24 -> double
  • UInt24 -> decimal
  • byte -> UInt24
  • sbyte -> UInt24
  • short -> UInt24
  • ushort -> UInt24
  • int -> UInt24


Code:
 
// Explizites Umwandeln geht nur, mit Boxing:
 int zahl = 500;
 byte explizit = (byte)zahl;
 
// Implizites Umwandeln geht ohne Boxing, weil keine Informationen verloren gehen. Das Zielformat hat einen größeren Wertebereich als das Quellformat:
 byte zahl = 200;
 int implizit = zahl;
 


Int32 in UInt24
Da sind wir dann auch schon bei einer wichtigen Besonderheit dieses Types: Ich erlaube ein implizites Umwandeln des Types int (Int32) in UInt24, obwohl Informationen verloren gehen könnten (Negative Werte und alle über UInt24.MaxValue). Ich habe mich trotzdem dafür entschieden, weil ich dem Boxing vorbeugen möchte und mir einen gewissen Performancegewinn verspreche. Bei der Umwandlung wird der Betrag des Wertes ermittelt (Die Zahl ohne Vorzeichen) und solange verringert, bis sie unterhalb UInt24.MaxValue liegt. Danach wird sie in drei Bytes aufgeteilt und gespeichert.

Beachtet dies bitte wenn ihr dieses struct verwendet. Es ist auf meine eigenen Bedürfnisse hin zugeschnitten. Wenn ihr noch etwas braucht oder vermisst, dann schreibt einfach einen Beitrag. Ihr könnt auch Extentions verwenden. Wie das geht und wie ihr euren eigenen Datentyp schreibt erfahrt ihr hier ab 18, Extentions bei Lektion 32.

Download: http://download.magony.org/?file=csharp/Snippets/UInt24.zip
Namespace: System
using: System.Runtime.InteropServices
using: System.IO;

Schöne Grüße,
Magony

_________________
Bei Fragen, Lob, Kritik, Vorschläge, hilfreiche Hinweise oder Alternativvorschläge: Beitrag, neues Thema oder PN.
Für Dinge die diskutiert werden sollten, bitte neues Thema im jeweiligen Forum.
Wenn du nicht weißt wohin: Forum Unsortiert.


Di 12. Mär 2013, 21:29
Diesen Beitrag melden
Profil Website besuchen
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Auf das Thema antworten   [ 1 Beitrag ] 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst neue Themen in diesem Forum erstellen.
Du darfst Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software
Deutsche Übersetzung durch phpBB.de

Impressum