Содержимое лямбды C # не произойдет, пока не будет вызвано, верно? Кроме того, очистка кода - PullRequest
1 голос
/ 08 июня 2010

У меня есть следующие методы:

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);
        });
}

Мой вопрос касается пятого параметра, переданного от updateExistingCredentialsSection до updateExistingSection, () => new[] { createNode(USER_TAG, doc, newUser), ... }.Насколько я понимаю, эти createNode вызовы не произойдут, если только лямбда-выражение не будет вызвано в updateExistingSection, верно?Аналогично для вызовов updateExistingLeafNode в последнем параметре, заданном updateExistingSection.

Кроме того, с точки зрения дизайна, выглядит ли какой-либо метод смешным?Вы видите способ, которым я мог бы сделать любой метод меньшим, или потребовать меньше параметров?Я пытался высушить вещи, что и привело к написанию updateExistingSection, так как у меня было несколько методов, выполняющих одинаковую функциональность.

1 Ответ

4 голосов
/ 08 июня 2010

Правильно. Думайте о лямбдах как о методах. Вы можете определить их где угодно (разрешено законом), но код внутри них не запускается до тех пор, пока не будет вызван явно.

Фактически, код для некоторых лямбд никогда не может быть запущен по заданному пути выполнения, если в функции, которой вы передаете их, есть логика ветвления.

...