2009-12-21 50 views
2

我有以下一段測試代碼,想要在封閉lambda表達式外訪問變量結果。顯然這不起作用,因爲結果總是爲空?我已經谷歌搜索了一下,但似乎讓自己更加困惑。我有什麼選擇?訪問封閉範圍外的lambda表達式

RequestResult result = null; 
RunSession(session => 
{ 
    result = session.ProcessRequest("~/Services/GetToken"); 
}); 
result //is null outside the lambda 

編輯 - 下面

的RunSession方法的詳細信息具有以下特徵

protected static void RunSession(Action<BrowsingSession> script) 

回答

4

結果變量,這絕對是從拉姆達範圍之外的訪問。這是lambda的核心特徵(或者匿名代表,lambda只是匿名代表的語法糖),稱爲「詞法關閉」。 (有關更多信息,請參見http://msdn.microsoft.com/en-us/magazine/cc163362.aspx#S6

只是爲了驗證,我重寫了代碼,僅使用了更多基本類型。

class Program 
{ 
    private static void Main(string[] args) 
    { 
     string result = null; 
     DoSomething(number => result = number.ToString()); 
     Console.WriteLine(result); 
    } 

    private static void DoSomething(Action<int> func) 
    { 
     func(10); 
    } 
} 

這將打印10,所以我們現在知道,這應該工作。

現在可能是什麼問題與您的代碼?

  1. session.ProcessRequest函數是否工作?你確定它不會返回null嗎?
  2. 也許你的RunSession在後臺線程上運行lambda?在這種情況下,在下一行訪問其值時,lambda尚未運行。
+0

將考慮背地面過程,我使用這個博客的代碼: - http:// geekswithblogs.net/thomasweller/archive/2009/12/12/integration-testing-an-asp.net-mvc-application-without-web-server-or.aspx 反過來使用http://blog.codeville .net/2009/06/11/integration-testing-your-aspnet-mvc-application/ 所以它可能是後臺線程! – Rippo 2009-12-21 16:46:12

0

因爲它爲空,直到你的λ運行,你確定拉姆達裏面的代碼執行?

在外部作用域中是否存在其他結果變量,並且您試圖訪問外部作用域變量,但lambda引用了內部作用域?

事情是這樣的:

class Example 
{ 
    private ResultSet result; 

    public Method1() 
    { 
     ResultSet result = null; 
     RunSession(session => { result = ... }); 
    } 

    public Method2() 
    { 
     // Something wrong here Bob. All our robots keep self-destructing! 
     if (result == null) 
      SelfDestruct(); // Always called 
     else 
     { 
      // ... 
     } 
    } 

    public static void Main(string[] args) 
    { 
     Method1(); 
     Method2(); 
    } 
} 

如果RunSession不是同步的,你可能有一個時機的問題。

+0

謝謝,外部範圍沒有其他結果變量。 – Rippo 2009-12-21 09:49:56

0

試試這個..

protected static void RunSession(Action<BrowsingSession> script) 
    { 
     script(urSessionVariableGoeshere); 
    } 

而且

RequestResult result = null; 
    Action<sessionTyep> Runn = (session =>{ 
     result = session.ProcessRequest("~/Services/GetToken"); 
    } 
    ); 
    RunSession(Runn); 
    var res = result; 
+0

謝謝,雖然我想弄清楚「SessionVar」應該是什麼... – Rippo 2009-12-21 09:49:19

+0

檢查我的更新.... – RameshVel 2009-12-21 10:21:10