2010-06-08 6 views
1

J'ai également les méthodes suivantes:Le contenu de C# lambda ne se produira pas avant d'être appelé, n'est-ce pas? , Le nettoyage de code

protected static void updateExistingSection(XmlDocument doc, 
    XmlNode rootNode, string sectionTag, CreateSection createSection, 
    Func<XmlNode[]> createChildNodes, Action<XmlNode> firstSection) 
{ 
    IEnumerable<XmlNode> sections = 
     getChildNodesByName(rootNode, sectionTag); 
    if (sections.Count() < 1) 
    { 
     rootNode.AppendChild(createSection(doc, createChildNodes())); 
     return; 
    } 
    removeSubsequentNodes(sections, rootNode, firstSection); 
} 

private static void updateExistingCredentialsSection(XmlDocument doc, 
    XmlNode rootNode, string newUser, string newPassword, string newHost) 
{ 
    updateExistingSection(doc, rootNode, CREDENTIALS_SECTION_TAG, 
     createCredentialsSection, 
     () => new[] { 
      createNode(USER_TAG, doc, newUser), 
      createNode(PASSWORD_TAG, doc, newPassword), 
      createNode(HOST_TAG, doc, newHost) 
     }, 
     credentialsNode => 
     { 
      updateExistingLeafNode(USER_TAG, doc, credentialsNode, newUser); 
      updateExistingLeafNode(PASSWORD_TAG, doc, credentialsNode, 
       newPassword); 
      updateExistingLeafNode(HOST_TAG, doc, credentialsNode, newHost); 
     }); 
} 

Ma question concerne le cinquième paramètre passé dans updateExistingCredentialsSection-updateExistingSection, l'un () => new[] { createNode(USER_TAG, doc, newUser), ... }. Je crois comprendre que ces appels createNode ne se produiront pas à moins que cette expression lambda ne soit appelée dans updateExistingSection, n'est-ce pas? De même pour les appels updateExistingLeafNode dans le dernier paramètre donné à updateExistingSection.

D'un point de vue conceptuel, est-ce que l'une ou l'autre méthode est ridicule? Voyez-vous un moyen de réduire la taille de l'une de ces méthodes ou d'exiger moins de paramètres? J'ai essayé de sécher les choses, ce qui a conduit à écrire updateExistingSection en premier lieu, puisque j'avais plusieurs méthodes faisant la même fonctionnalité.

+0

En termes de lisibilité, il serait peut-être préférable que les deux lambdas soient déclarés comme des méthodes séparées, surtout si elles sont utilisées plusieurs fois, comme cela vous avez trop de});} blocs – SWeko

Répondre

4

Correct. Pensez aux lambdas comme méthodes. Vous pouvez les définir n'importe où (légalement autorisés), mais le code qu'ils contiennent n'est pas exécuté avant d'être invoqué explicitement.

En fait, le code de certains lambdas pourrait ne jamais être exécuté dans un chemin d'exécution donné s'il y a une logique de branchement dans la fonction à laquelle vous les passez.