Quali sono i vantaggi di un ciclo foreach rispetto a un ciclo for body-less

1

In C # puoi usare un ciclo for senza dichiarare il corpo, qual è il vantaggio di usarlo nel codice di produzione anziché usare un ciclo foreach ?

Esempio

I miei esempi qui sotto usano il reflection per ottenere il valore della proprietà di un oggetto basato sul parametro p_strPropertyPath . Il metodo può anche esaminare la proprietà di una proprietà, ad esempio MyClass.Property.SubProperty .

Secondo me, il ciclo foreach è più ovvio in ciò che dovrebbe fare, mentre il primo mi sembra più pulito.

Body-less For Loop

L'esempio seguente utilizza un ciclo for-body senza corpo e un enumeratore:

private string GetValue(MyClass p_objProperty, string p_strPropertyPath)
{
    string[] lstProperties = p_strPropertyPath.Split('.');
    IEnumerator objEnumerator = lstProperties.GetEnumerator();

    object objValue;

    for (
        objValue = p_objProperty;
        objValue != null && objEnumerator.MoveNext();
        objValue = objValue.GetType().GetProperty(objEnumerator.Current as string).GetValue(objValue)
        ) ;

    return Convert.ToString(objValue);
}

foreach ciclo

L'esempio seguente utilizza un ciclo foreach :

private string GetValue(MyClass  p_objProperty, string p_strPropertyPath)
{
    string[] lstProperties = p_strPropertyPath.Split('.');
    object objValue = p_objProperty;
    foreach (string strProperty in lstProperties)
    {
        objValue = objValue.GetType().GetProperty(strProperty).GetValue(objValue);
        if(objValue == null) break;
    }

    return Convert.ToString(objValue);
}
    
posta Brownish Monster 16.10.2017 - 17:40
fonte

1 risposta

4

Il tuo codice suggerito non è equivalente se lstProperties è vuoto, (come indicato da ErikEidt, anche se non è vuoto), se p_objProperty è nullo, o se .GetValue() restituisce null. Tutti questi casi sono abbastanza rilevanti perché la funzione mostrata sta usando la riflessione per attraversare un grafico dell'oggetto.

Un ciclo for senza un corpo può essere una descrizione elegante quando si cerca un determinato valore o quando il corpo del loop si verifica già come un effetto collaterale della condizione del ciclo.

Non penso che il codice mostrato sia un fantastico esempio di questa funzionalità, perché entrambe le condizioni del ciclo e della sezione iteratore hanno effetti collaterali. Un ciclo for classico è più applicabile quando tutte le sezioni sono abbastanza semplici. Può essere più chiaro disassemblare il ciclo for in un ciclo while, soprattutto perché il codice è un po 'troppo complesso per una singola riga:

object value = initialValue;
while (value != null && enumerator.MoveNext())
{
    var propertyName = enumerator.Current as string;
    value = value.GetType().GetProperty(propertyName).GetValue(value);
}

Se dovessi utilizzare un ciclo foreach, fai attenzione a convertire la condizione esatta del ciclo, ad es. rompendo dal loop:

object value = initialValue;
foreach (string propertyName in properties)
{
    if (value == null) {
        break;
    }
    value = value.GetType().GetProperty(propertyName).GetValue(value);
}
    
risposta data 16.10.2017 - 18:03
fonte

Leggi altre domande sui tag