Christoph: Pro/Contra Break in Schleifen

Beitrag lesen

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