我有一个带签名的递归函数
public static string Recurse(string pattern, ObjectDict dict)
dict
的值永远不会改变。让我感到困扰的是,我应该随身携带几十个引用,并在每次再次调用函数时传递它。有办法解决这个问题吗?
“永不改变”,我的意思是在最初的电话之后。
答案 0 :(得分: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 :(得分:2)
一种选择是使用lambda表达式来保存Recurse
函数的实际逻辑。然后可以递归调用它,因为它是一个lambda,它可以访问dict
对象,而不必传递它
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);
}
答案 2 :(得分:1)
嗯,显而易见的替代方法是,如果可以的话,在Recurse
上设置ObjectDict
实例方法。然后,您可以在内部致电Recurse(pattern)
。
如果 实际上,这两个选项实际上非常相似 - 例如方法,实际上是一个不可见的“this”参数,它首先在其余参数之前传递。你碰巧把你的东西放在另一端:)