在lambda函数中使用'out'参数是否有一些技巧?

时间:2011-04-04 14:07:16

标签: c# lambda

if ( (new Func</*out*/ string, bool>( (/*out*/ string uname) => ....

更多细节:这是登录功能的一部分,我只想让我的lambda函数用out参数更改login-name用户,并告诉我用户使用bool返回登录。

我真的明白我可以返回Tuple然后获取我的字符串值,但我想要一些个人清晰度的参数。如果用户没有登录,我最好只返回null的字符串,只想知道我是否可以在lambda函数中使用参数。

而且我真的知道在语句位置上带有表达式的代码并不是那么干净但是没有人说我是否对编译器来说真的很糟糕。

3 个答案:

答案 0 :(得分:5)

Lambda 表达式不起作用,但对于代理人来说,使用语句正文应该没问题:

bool outval = false; // definite assignment
Func<bool> func = () => {
    return SomeMethod(out foo);
};
bool returned = func();
// check both outval and returned

对于代表......你需要定义自己的:

public delegate bool MyType(out string value);

答案 1 :(得分:2)

您不能将参数与lambda表达式一起使用。见stackoverflow question

答案 2 :(得分:2)

虽然你不能使用out关键字我找到了一个解决方案,让你基本上可以在.NET中实现C ++风格的内存指针。 I found this class由于您打开此SO问题的原因无法在我想要的地方使用out参数。

public class Ptr<T>
{
    Func<T> getter;
    Action<T> setter;

    public Ptr(Func<T> g, Action<T> s)
    {
        getter = g;
        setter = s;
    }

    public T Deref
    {
        get { return getter(); }
        set { setter(value); }
    }
}

用法示例

private IDocumentSession _session = DocumentStore.OpenSession()

var ptr = new Ptr<IDocumentSession>(
                () => _session, 
                newValue => _session = newValue))

session.Deref.SaveChanges();
session.Deref = DocumentStore.OpenSession();

我在批处理程序中使用它,当我需要细粒度的会话控制同时还留下环境会话上下文时,允许批处理操作使用RavenDB控制会话刷新。警告的话我不知道这种类型的代码在长期运行的生产应用程序中会有什么影响,因为我不确定这是否会混淆GC并导致内存永远不会被回收。