【问题标题】:Is there some trick to use 'out' parameters inside lambda function? [duplicate]在 lambda 函数中使用“out”参数有什么技巧吗? [复制]
【发布时间】:2011-04-04 14:07:16
【问题描述】:
if ( (new Func</*out*/ string, bool>( (/*out*/ string uname) => ....

更多细节:这是登录函数的一部分,我只想让我的 lambda 函数使用 out 参数更改登录名用户,并说用户使用它的 bool 返回登录。

我真的明白我可以返回元组,然后获取我的字符串值,但为了个人清楚,我想要完全输出参数。如果用户没有登录,我最好只返回带有 null 的字符串,只是想知道我是否可以在 lambda 函数中使用 out 参数。

我真的知道语句位置上带有表达式的代码不是那么干净但是没有人说我是否真的对编译器不利。

【问题讨论】:

  • 注意,这样的 lambda 表达式可以有 ref/out 参数。例如这行得通:delegate bool Logger(out string name); Logger f = (out string bar) =&gt; { bar = ""; //assign return ... }; ..就是 Action/Func 你做不到。你需要自己的代表。

标签: c# lambda


【解决方案1】:

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

【讨论】:

  • 所以...我真的不想在这里使用代表,但我什至不知道他们是否可以在这里正常工作。
  • 不,你确实想要这里的代表,只是可能不是 lambda 表达式。
  • 好的,是的,我愿意 :) if ((new ChUname((out string uname) => ... 效果很好。
  • 这仍然是一个 lambda。你不能有 (out string usname) => ... 忘掉 lambdas,只看基本的委托用法。
  • 但它工作得很好,ChUname 是我的代表,它可以更改我的用户名。
【解决方案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 并导致内存永远不会被回收。

【讨论】:

    【解决方案3】:

    您不能在 lambda 表达式中使用 out 参数。见this Stack Overflow question

    【讨论】:

    • 有点混乱。你可以有一个像 (int i, out int j) =&gt; ... 这样的 lambda,其中包含 out 关键字,并且可以将 lamda 分配给委托类型的变量。但是,它不能分配给表达式树。您所指的问题是关于在 lambda 中捕获常规方法的 out 参数。这就像public static bool UsualMethod(out int i) { /* body of normal method */ Action f = () =&gt; { Console.WriteLine(i); }; ... ... }这个是非法的。 lambda 尝试捕获包含方法的 out 参数。
    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2011-06-02
    • 2022-12-06
    • 1970-01-01
    相关资源
    最近更新 更多