2010-11-24 8 views
5

나는 서명 dict의 값은 결코 변경되지재귀 함수에서 동일한 값을 전달하고 있습니까?

public static string Recurse(string pattern, ObjectDict dict) 

와 재귀 함수를 가지고있다. 그것은 내가 그것에 대해 수십 개의 참조를 가지고 다니고, 함수를 다시 호출 할 때마다 전달해야한다는 것을 나에게 귀찮게한다. 이 문제를 해결할 방법이 있습니까?

"절대 변경하지 마십시오."라는 말은 초기 호출 이후를 의미합니다.

답변

10

참조는 매우 가볍기 때문에 걱정하지 마십시오.

당신이 정말로 (그리고 나는 당신이 생각하지 않는다) 그것을 을 피하기 같은 것을 고려할 필요가있는 경우 : 이렇게

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

을 더 이상에 대한 참조 주위에 통과하지 않습니다 같은 사전, 그냥 항상 회원 개체에 액세스. 그러나 이제는 함수의 특성이 static입니다.

+1

+1 간결하게 전달할 필요없이 dict 개체에 액세스 할 수 있습니다! –

1

글쎄, 확실한 대안은 가능하면 ObjectDictRecurse 인스턴스 메서드를 만드는 것입니다. 그러면 내부적으로 Recurse(pattern)으로 전화하면됩니다.

어떤 이유로 든 이 아닌 경우이 가능하면 땀을 내지 마십시오. 사실, 두 옵션은 실제로 매우 유사합니다. 예를 들어 메소드의 경우, 나머지 매개 변수보다 먼저 전달되는 보이지 않는 "this"매개 변수가 있습니다. 방금 상대방에게 너의 것을 넣었을거야 :)

+0

'ObjectDict'는 단지 'Dictionary '입니다. 왜냐하면 저는 너무나 게으름 피우므로 모든 것을 입력 할 수 있습니다 :) – mpen

2

하나의 옵션은 Recurse 함수의 실제 논리를 유지하기 위해 람다 식을 사용하는 것이다. 이 재귀 적 호출 할 수 있습니다 그것은 람다 때문에 그것은 주위

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 ... 최근에 람다가 언제 그렇게 유용했는지에 대한 질문이있었습니다. 함수에 대한 매개 변수로 사용하지 않는 한 결코 유용하지 않습니다 ... 확실히 보여주었습니다 : p 이렇게 할 수 있습니다. 고마워 – mpen

관련 문제