2016-05-16 37 views
1

我很好奇是否有可能在運行時跟蹤對象引用下的操作(複製,訪問等)。 例如,如果我調試以下代碼:運行時對象參考跟蹤

private static void Main(string[] args) 
{ 
    // Creating new object and reference. 
    var myList = new List<int>(); 
    // a) Copying a reference to method. 
    UpdateList(myList); 
}    

private static void UpdateList(IList<int> list) 
{ 
    // b) Copying the reference. 
    var localList = list; 

    // c) Accessing the object through copied reference. 
    localList.Add(1); 
    // d) Copying a reference to method. 
    int count = GetListElementsCount(localList); 
} 

private static int GetListElementsCount(IList<int> list) 
{ 
    // Another reference access. 
    // Breakpoint here. 
    return list.Count; 
} 

將斷點設置成GetListElementsCount,我可以看看通過list說法起源和它(A,B,C,d)所做的更改? Roslyn編譯器是否爲此提供了一些C#API?

非常感謝。

+0

HTTP://source.roslyn。 IO /#Microsoft.CodeAnalysis /編譯/ DataFlowAnalysis.cs – SLaks

回答

0

在Visual Studio Enterprise中有一個名爲Historical Debugging的功能。通過一些limitations(僅收集AutosLocal窗口中的變量),可以查看變量歷史記錄,而無需重新執行代碼。

0

它非常依賴於您的特定需求。

您可以檢查DataFlowAnalysis作爲SLaks評論,如果它符合您的需求。

或者當然你也可以使用簡單樸素的選項,在每個相關操作之後使用\日誌記錄。

如果這兩個選項是不夠的,你可以嘗試通過包裝每一個創造與儀器做\ GET \設置等

儀器可以是靜態的像StaticProxy.Fody或動態(城堡,李林甫,Sprint.Net等)。

其他類型的儀器是Instant項目。它使用NRefactory,但您可以輕鬆將其轉換爲使用Roslyn。

在獲得有關運行時行爲的信息後,可以根據需要使用它。

在您的示例中,在保存了某些數據結構中的所有對象更改並中斷GetListElementsCount方法後,您可以調查數據結構並要求執行特定操作。

您的數據結構可以是(僅用於非常簡單的示例): Dictionary其中key是操作名稱,value是運行操作後的新值。

對於創作:鍵= 「創建」,值=列表

對於呼叫list.Add(1):=鍵方法調用 - 添加,值= 1