我很想知道是否可以在运行时跟踪对象引用下的操作(复制,访问等)。 例如,如果我调试以下代码:
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 :(得分:0)
Visual Studio Enterprise中有一个名为Historical Debugging的功能。对于一些limitations(仅在Autos
和Local
窗口中收集变量),它提供了查看变量历史记录而无需重新执行实际代码的可能性。
答案 1 :(得分:0)
这完全取决于您的具体需求。
如果符合您的需要,您可以将DataFlowAnalysis评为SLaks评论。
当然,您可以使用简单的天真选项,在每次相关操作之后使用日志记录。
如果这两个选项还不够,你可以通过包装每个创建\ get \ set等来尝试使用检测。
仪器可以是静态的,如StaticProxy.Fody或动态的(Castle,LinFu,Sprint.Net等)。
其他类型的工具是Instant项目。它使用NRefactory,但您可以轻松地将其转换为使用Roslyn。
获得有关运行时行为的信息后,可以根据需要使用它。
在您的示例中,在保存了某些数据结构中的所有对象更改并使用GetListElementsCount
方法中断后,您可以调查数据结构并请求特定操作。
您的数据结构可以(仅用于非常简单的示例): 字典,其中键是操作名称,值是运行操作后的新值。
创作:key =“creation”,value = List
对于呼叫列表。添加(1):key =方法调用 - 添加,值= 1