| 

.NET C# Java Javascript Exception

6
Über die Deklaration einer Methode lege ich die Typen von den Parametern fest.
private string ProcessValues(int i, int j)
{
...
}


Gibt es eine einfache Möglichkeit, die Wertebereiche von i und j zu beschränken? Also etwa
1 < i < 10
400 < j < 500
16.02.2011
Snelli 61 1 3
1
Wie meinst du das? Die aufrufende Methode soll nur diese Werte hereingeben oder soll die Methode ProcessValues nur Parameter in diesem Wertebereich annehmen. Was soll passieren, wenn die Werte nicht in dem Bereich liegen?
Zorro 16.02.2011
5 Antworten
7
Ab .NET 4 gibt es eingebaute Unterstützung für "Design by Contract" in Gestalt der Contract-Klasse. Damit könntest Du am Anfang Deiner Methode schreiben

private string ProcessValues(int i, int j)
{
Contract.Requires(1 < i && i < 100);
...
}


Nicht so tief im Framework verankert, dafür auch in älteren Version nutzbar, ist CuttingEdge.Conditions.

Im Sinne von Zorros Rückfrage wäre das eine Lösung, die sicherstellt, dass die Methode nur Werte aus dem vorgegebenen Bereich annimmt. Mit Datentypen, wie sie Jürgen vorgeschlagen hat, zwingst Du hingegen den Aufrufer, in seinem Verantwortungsbereich für die Einhaltung des Wertebereichs zu sorgen und kannst dann in Deiner Methode sicher sein, dass nichts anderes hereinkommt. Das ist aber nur dann ein gangbarer Weg, wenn es Dir nur um wenige feste Wertebereiche geht, die möglichst auch eine fachliche Bedeutung haben sollten, z.B. "Lottozahlen" anstelle von "Range1To49".
16.02.2011
Matthias Hlawatsch 13,2k 4 9
Ich glaube ich sollte mir mal ein "Was ist eigentlich neu in .NET 4"-Buch besorgen ;-) Contract kannte ich noch nicht, super Tip!
Torsten Weber 16.02.2011
2
Hier ein Beispiel Ohne Attribute, das zur Laufzeit den Wertebereich prüft (von der Syntax ähnlich Contract, aber eben zur Laufzeit):

private int _rangedIntProperty;

/// <summary> Min = 5, Max = 10 </summary>
public int RangedIntProperty
{
get { return _rangedIntProperty; }
set
{
Util.VerifyRange(value, 5, 10);
_rangedIntProperty = value;
}
}

public static void VerifyRange(int val, int min, int max)
{
if (val < min || val > max)
throw new ArgumentOutOfRangeException("Value " + val +
" was out of the allowed range ("
+ min + ", " + max + ")");
}
16.02.2011
Maria Simlinger 1,1k 1 9
1
Werden diese Wertebereiche häufig im Programm verwendet?
Wenn ja, dann würde sich ein eigener Datentyp anbieten.
Siehe dazu: "implicit operator" implicit (C# Reference) und Understanding Implicit Operator Overloading in C#.
16.02.2011
Jürgen Luhr 7,1k 2 9
Der implicit-Operator sollte aber nur für die Konvertierung eigener Typ -> int verwendet werden, in der Gegenrichtung ist eine explizite Konvertierung vorzuziehen.
Matthias Hlawatsch 16.02.2011
0
Du könntest ein eigenes Attribute definieren welches diese Aufgabe für dich übernimmt.
Der Sprachsyntax von C# unterstützt es jedoch nicht von haus aus.
16.02.2011
Floyd 14,6k 3 9
0
Meine Empfehlung wäre eine ArgumentOutOfRangeException zu werfen, entweder in der Methode oder eben über eine eigene Klasse.

public struct ValueProcessor {
public ValueProcessor(int i, int j) {
if (i < 1 && i > 10)
throw new ArgumentOutOfRangeException("i");
if (j < 400 && j > 500)
throw new ArgumentOutOfRangeException("j");

I = i;
J = j;
}

public int I { get; set; }
public int J { get; set; }
}

// Method signature
public string ProcessValues(ValueProcessor processor);


Der Vorteil dieser Methode wäre auch, dass du verschiedene Klassen für verschiedene Wertebereiche erstellen kannst.

Was natürlich noch möglich wäre, aber etwas undurchschaubarer ist, dass du zum Beispiel statt der ArgumentOutOfRangeException den Wert auf das Minimum bzw. das Maximum setzt.
16.02.2011
woni 170 1 4
1
Soweit ich sehe, muss der Konstruktor den Standardkonstruktor aufrufen, damit der Code überhaupt kompiliert. Und da sich bei structs der Standardkonstruktor nicht ausblenden läßt, braucht man passende Default-Werte für I und J, sonst wird ProcessValues am Ende doch mit (0,0) aufgerufen. Aber ob sich fachlich sinnvolle Default-Werte überhaupt festlegen lassen, ist nicht von vornherein klar.
Matthias Hlawatsch 16.02.2011

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