5 Stimmen

Was ist zu tun, wenn Contract.Assert(true) verwendet wird und die Methode etwas zurückgeben muss?

Ich habe ein Stück Code mit der folgenden Logik:

//pseudo-code
foreach (element in elementList) {
    if (element is whatever)
        return element;
    }
}

Theoretisch gibt es immer ein Element, das was auch immer ist, so dass diese Methode keine Probleme aufwerfen sollte. Auf jeden Fall habe ich eine Behauptung an das Ende der Methode gesetzt, nur um sicherzugehen:

//pseudo-code
foreach (element in elementList) {
    if (element is whatever)
        return element;
    }
}

Contract.Assert(false, "Invalid state!");

Das Problem ist, dass diese Methode etwas zurückgeben muss und der Compiler nicht versteht, dass die Behauptung die Programmausführung unterbrechen wird. Bevor ich Contracts verwendet habe, habe ich in solchen Situationen eine Exception geworfen, was das Problem gelöst hat. Wie würden Sie dies mit Contract.Assert() handhaben? Null oder default(element_type) nach dem Contract.Assert()-Aufruf zurückgeben, in dem Wissen, dass es nie aufgerufen wird, und den Compiler zum Schweigen bringen? Oder gibt es eine andere, elegantere Möglichkeit, dies zu tun?

Danke

2voto

Mike Two Punkte 42868

Sie können

var result = null;
foreach (element in elementList) {
    if (element is whatever)
        result = element;
        break;
    }
}

Contract.Assert(result != null, "Invalid state!");
return result;

I

E

return elementList.Where( e => e is whatever).First();

E

c

return elementList.First( e => e is whatever);

e

T

B

var results = elementList.Where( e => e is whatever);
Contract.Assert(results.Count() == 1, "Boo");
return results.First();

b

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X