2010-11-24 10 views
5

Tengo una función recursiva con la firmaPasar el mismo valor en una función recursiva?

public static string Recurse(string pattern, ObjectDict dict) 

El valor de dict nunca cambia. Me molesta que deba llevar docenas de referencias y pasarlas cada vez que vuelva a llamar a la función. ¿Hay alguna forma de evitar esto?

Por "nunca cambia", quiero decir después de la llamada inicial.

Respuesta

10

Las referencias son extremadamente livianas, así que no se preocupe.

Si realmente necesita para evitar que (y, no creo que lo hacen), considerar algo como esto:

class MyClass 
{ 
    private ObjectDict m_dict; 

    public string Recurse(string pattern, ObjectDict dict) 
    { 
     m_dict = dict; 
     return HelperRecurse(pattern); 
    } 

    private string HelperRecurse(string pattern) 
    { 
     // do some work. (referring to m_dict) 
     HelperRecurse(pattern); // Go recursive 

     return "Hello World"; 
    } 
} 

Al hacer esto, usted ya no está pasando alrededor de las referencias a el mismo diccionario, siempre accediendo a un miembro-objeto. Sin embargo, ahora has perdido la naturaleza de tu función static.

+1

+1 por razones de brevedad! –

1

Bueno, la alternativa obvia es hacer Recurse un método de instancia en ObjectDict si es posible. Luego puede llamar al Recurse(pattern) internamente.

Si eso es no posible por alguna razón, no se preocupe. De hecho, las dos opciones son muy similares: por ejemplo, hay un parámetro "this" invisible que se pasa primero, antes que el resto de los parámetros. Usted acaba de poner el suyo en el otro extremo :)

+0

'ObjectDict' es simplemente' Dictionary 'porque soy demasiado flojo para escribir eso en todas partes :) – mpen

2

Una opción es usar una expresión lambda para mantener la lógica real de la función Recurse. Esto puede ser llamada recursiva y porque es un lambda que tendrá acceso al objeto dict sin tener que pasar alrededor

public static string Recurse(string initialPattern, ObjectDict dict) { 
    Func<string, string> inner = null; 
    inner = pattern => { 
    // Logic which uses calls to inner for recursion. Has access to dict 
    // because it's a lambda. For example 
    if (dict.SomeOperation()) { 
     return inner(someOtherPattern); 
    } 
    return aValue; 
    }; 
    return inner(initialPattern); 
} 
+0

Hah ... había una pregunta sobre cuándo las lambdas son útiles en SO recientemente, y pensé que sí nunca ser útil a menos que se use como un parámetro para una función ... seguro me mostró: p Podría hacerlo de esta manera. Gracias: D – mpen

Cuestiones relacionadas