2011-04-04 57 views
8
if ((new Func</*out*/ string, bool>((/*out*/ string uname) => .... 

更多详细信息:这是登录功能的一部分,我只是想让我的lambda函数用out参数更改登录名用户,并表示用户使用它的bool返回值登录。有没有一些技巧在lambda函数中使用'out'参数?

我真的明白,我可以返回元组,然后得到我的字符串值,但我想要一些个人清晰的参数。我最好只返回空字符串,如果用户不是登录,只想知道我是否可以使用lambda函数内的参数。

我真的明白,语句位置上的表达式的代码并不那么干净但是如果这对编译器来说真的不好,没人会说我。

+0

注意,这样的lambda表达式可以有'ref/out'参数。对于例如这工作: '委托布尔记录器(出字符串名称); Logger f =(out string bar)=> { bar =“”; // assign return ... };' ..只是用'Action/Func'你不能这样做。你需要你自己的代表。 – nawfal 2013-12-22 03:00:36

回答

5

拉姆达表达将无法​​正常工作,但对于代表你应该罚款使用如下语句体:

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

所以......我真的不想在这里使用代表,但我甚至不知道他们是否可以在这里正常工作。 – Cynede 2011-04-04 14:16:25

+1

不,你*希望这里的代表,可能不是lambda表达式。 – 2011-04-04 14:19:41

+0

好吧,是的,我做的:)如果((新ChUname((串出UNAME)=> ...效果很好。 – Cynede 2011-04-04 14:23:32

2

您不能将参数与lambda表达式一起使用。看到这个stackoverflow question

+1

有点混乱。你可以像'(int i,out int j)=> ...'那样拥有一个lambda,其中包含'out'关键字,并且可以将lamda分配给委托类型的变量。不过,它不能分配给表达式树。你提到的问题是关于在lambda内捕获常规方法的'out'参数。这就像'public static bool UsualMethod(out int i){/ *正常方法的主体*/Action f =()=> {Console.WriteLine(i); }; ''。 ***这***是非法的。 lambda试图捕获包含方法的'out'参数。 – 2013-02-26 20:04:02

2

虽然你不能用我做的出来的关键字找到一个解决方案,可以基本实现C++风格的内存指针在.NET。 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并导致内存永远不会被回收。