.NET C# Java Javascript Exception

 | 
Frage stellen Fragen Themen Mitglieder Abzeichen RSS-Feed
6
Es geht darum einen Wertetypen zu definieren wie zum Beispiel Priorität mit dem Bereich 0..9 oder Wichtung mit 0.0 bis 1.0. Dabei sollen Zuweisungen mit int bzw. double möglich sein, Enumerations entfallen daher. Also
Prio p = 8;
Weight w = 0.5;
Das ist mit einer Struktur und einem impliziten Operator recht schnell erreichbar.
public static implicit operator Prio(byte args)
Nun können aber auch andere Werte außerhalb {0..9} übergeben werden, was dann intern abgefangen werden muss. Bei den Standard Typen meldet schon spätestens der Compiler einen Fehler.

Wie kann ein eigener Wertetyp sinnvoll definiert werden, um diesen analog zu einem Standardtyp zu verwenden, jedoch mit eingeschränkten Wertebereich?
29.09.09
me 786 1 5
Kommentieren - Für Rückfragen oder Anmerkungen
3 Antworten
1
Am einfachsten wenn du dir mit dem Reflektor anschaust wie zB System.Byte implementiert ist. Analog dazu gehst du dann vor.

Bei den Standard Typen meldet schon spätestens der Compiler einen Fehler.

Das lässt sich problem kompilieren:
double d = double.MaxValue;
int i = (int)d;

Der Fehler tritt erst zur Laufzeit auf bzw. bei ausgeschalteter Überlaufprüfung wird wieder von vorne begonnen (was in Folge zu Fehlern führt wenn dies nicht berücksichtigt wird).
29.09.09
gfoidl 6,7k 3 5
gfoidl 6,7k 3 5
1
Das habe ich schon getan, diesbezüglich gibt der Reflector nur nicht allzuviel her.
me 29.09.09
Wieso welche was fehlt dir konkret? (Siehe auch aktualisiert Antwort).
gfoidl 29.09.09
0
Beim Standardtyp Byte erhalten wir einen Fehler wenn wir schreiben
Byte b = 400;
Beim zu definiertem Typ wollen wir einen Wertebereich 0 bis 9, also bei der Zuweisung von 10 ebenfalls einen Fehler.
Prio p1 = 10; // <= Fehler
Prio p2 = 9; // hier ok
Im Operator wird byte als Typ angegeben und beide Zuweisungen sind zulässig. Ich habe jetzt mal alle Schnittstellen die Byte implementiert hinzugefügt, was diesbezüglich nichts bewirkt.
29.09.09
me 786 1 5
Sollte ein Kommentar werden, Entschuldigung
me 29.09.09
Der Kompilerfehler wird nur bei den eingebauten Typen geworfen (vielleicht ändert sich das aber in zukünfigen Versionen). Wenn es das ist was du meinst.
gfoidl 29.09.09
Anscheinend haben auch andere das Problem. Hier http://stackoverflow.com/questions/491199/why-java-c-and-c-dont-have-ranges wurde das diskutiert
me 30.09.09
0
Wenn ernsthaft Fragestellungen dieser Art für Applikation wichtig sind, sind vereinfachte Sprachen wie C# und Java nicht wirklich dafür geeignet.
Mit C++ und der Anwendung von Templates können solche Typen effizient werden.

Wichtig bei der Implementierung ist, dass es zwei verschiedene "set" operatoren gibt.
Einen für den eigenen Typ, wo keine Wertebereichsprüfung mehr notwendig ist,
und einen, der einen primitiven Typ wie int akzeptiert und den Wertebereich prüft.
Die Wertebereichsprüfung kann bei Verletzung entweder eine Ausnahme werfen,
oder den übergebenen Wert in den Wertebereich transformieren.
09.10.09
stefan.bachert 322 3
Somit sollte es möglich mit VC++ eine .net-Assembly zu erstellen die dies ermöglich. Diese Assembly (bzw. die Klassen daraus) können dann in C# verwendet werden.
gfoidl 09.10.09
Deine Antwort
Entweder einloggen... ...oder ohne Wartezeit registrieren
Name
Passwort
Passwort wiederholen
E-Mail
Geworben von


Login mit OpenID

Mit einem OpenID-Account kannst Du dich auf allen Webseiten anmelden, die OpenID unterstützen. Du hast bereits ein Benutzerkonto bei einem der folgenden Provider? Dann kannst Du dich direkt hier damit registrieren.


OpenID-Provider anklicken: