Moin.
Wie würdest du das ohne goto lösen?
Z.B. durch Hinzufügen eoiner weiteren boolschen Variable, die bei Bedarf ein break
hinter dem switch
auslöst:
void AddElement(Element element) {
bool vetoed = false;
bool voted = false;
bool allowed = false;
foreach(Constraint constraint in this.Constraints) {
switch(constraint.Satisfies(element, this)) {
case Constraint.Results.Allowed:
allowed = true:
break;
case Constraint.Results.Veto:
vetoed = true;
break;
case Constraint.Results.Vote:
voted = true;
break;
case Constraint.Results.IgnoreMe:
break;
default:
throw new NotSupportedException();
}
if(allowed) break;
}
if(allowed || (voted && !vetoed))
this.elements.Add(element);
else throw new ArgumentException(
"Can't add element due to constraint restrictions.");
}
Meiner Meinung nach macht das die Sache aber nicht wirklich besser...
Eine andere Möglichkeit wäre, dies Nebenbedingung allowed == true
in die Abbruchsbedingung der Schleife zu integrieren. Dazu müsste man meines (sehr begrenzten) Wissens nach die foreach
-Schleife duch eine for
-Schleife mit explizitem IEnumerator
ersetzen.
Christoph