| 

.NET C# Java Javascript Exception

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?
News:
29.09.2009
me 1,1k 2 9
3 Antworten
1
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.2009
stefan.bachert 395 4
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.2009
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.2009
gfoidl 9,4k 3 5
gfoidl 9,4k 3 5
1
Das habe ich schon getan, diesbezüglich gibt der Reflector nur nicht allzuviel her.
me 29.09.2009
Wieso welche was fehlt dir konkret? (Siehe auch aktualisiert Antwort).
gfoidl 29.09.2009
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.2009
me 1,1k 2 9
Sollte ein Kommentar werden, Entschuldigung
me 29.09.2009
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.2009
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.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH