簡體   English   中英

為什么不能在即時窗口中評估 lambdas?

[英]Why is it not possible to evaluate lambdas in the immediate window?

有什么特別的原因嗎? 是根本不可能還是只是還沒有實施? 也許有任何第三方插件允許 lambda 評估?

更新:

我在 codeplex Extended Immediate Window上找到了這個項目。 似乎它已經被放棄了一段時間,但這可以作為一個概念的證明。 有人知道任何其他即時窗口擴展插件嗎? 例如,那些可以在 C# 中運行 for/foreach 語句的語句?

微軟的JaredPar寫了幾篇博文來回答你的問題:第 1 部分第 2 部分 你會在那里找到答案。

在編寫 lambda 時,捕獲變量的行為顯着改變了底層代碼的構造(將變量移動到編譯器生成的類的字段中,這些字段本身很容易成為鏈接的閉包上下文)。

甚至不考慮這樣做的一般復雜性,它會有兩種選擇:

  • 將所有變量值捕獲為常量; 可行且非常簡單,但很容易意味着在立即窗口中執行的結果與在主體中執行的結果非常不同(非常不受歡迎)
  • 即時重寫整個代碼(出於上述原因)(猜測,不可能)

如果在“不受歡迎”和“不可能”之間做出選擇,我他們只是選擇不實現一個本質上很脆弱編寫起來非常復雜的功能。

嗯,我想是因為直接窗口只能計算表達式,或者說它只能做調用和賦值。 要評估 Lambda 表達式,必須為該 lambda 創建閉包,進行類型檢查,然后執行。

我認為這歸結為即時窗口只是一個評估器而不是解釋器。

http://msdn.microsoft.com/en-us/library/f177hahy(VS.80).aspx

“立即窗口用於在設計時調試和評估表達式、執行語句、打印變量值等。它允許您在調試期間輸入要由開發語言評估或執行的表達式。”

所以實際上,你的問題歸結為為什么你不能在即時窗口中定義函數(因為 lambda 只是匿名函數),我認為答案是它根本不是為此而設計的。

如果您仍然需要使用 Visual Studio 2013,您實際上可以使用包管理器控制台窗口在即時窗口中編寫循環或 lambda 表達式。 就我而言,我在函數頂部添加了一個列表:

    private void RemoveRoleHierarchy()
    {
#if DEBUG
        var departments = _unitOfWork.DepartmentRepository.GetAll().ToList();
        var roleHierarchies = _unitOfWork.RoleHierarchyRepository.GetAll().ToList();
#endif

        try
        {
            //RoleHierarchy
            foreach (SchoolBo.RoleHierarchy item in _listSoRoleHierarchy.Where(r => r.BusinessKeyMatched == false))
                _unitOfWork.RoleHierarchyRepository.Remove(item.Id);

            _unitOfWork.Save();
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
            throw;
        }
    }

我的 GetAll() 函數在哪里:

    private DbSet<T> _dbSet;

    public virtual IList<T> GetAll()
    {
        List<T> list;
        IQueryable<T> dbQuery = _dbSet;
        list = dbQuery
            .ToList<T>();

        return list;
    }

在這里我不斷收到以下錯誤,所以我想打印出各種存儲庫中的所有項目:

InnerException  {"The DELETE statement conflicted with the REFERENCE constraint \"FK_dbo.Department_dbo.RoleHierarchy_OranizationalRoleId\". The conflict occurred in database \"CC_Portal_SchoolObjectModel\", table \"dbo.Department\", column 'OranizationalRoleId'.\r\nThe statement has been terminated."} System.Exception {System.Data.SqlClient.SqlException}

然后,我通過在即時窗口中執行此命令來找出部門存儲庫中有多少記錄:

_unitOfWork.DepartmentRepository.GetAll().ToList().Count

其中返回 243。

因此,如果您在包管理器控制台中執行以下操作,它會打印出所有項目:

PM> for($i = 0; $i -lt 243; $i++) { $a = $dte.Debugger.GetExpression("departments[$i].OrgagnizationalRoleId"); Write-Host $a.Value $i }

這個想法的作者可以在這里找到: http : //ogresoft.blogspot.ca/2013/06/how-to-write-loop-or-lambda-expression.html

我假設,因為它是惰性求值,所以直接窗口無法事先知道捕獲的變量(閉包)應該具有哪些值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM