gpt4 book ai didi

c# - 除非使用断点单步执行,否则代码行不起作用

转载 作者:太空狗 更新时间:2023-10-29 19:40:49 25 4
gpt4 key购买 nike

我唯一能想到的是竞争条件,但据我所知,调用函数和代码行都是同步的。

/// <summary>
/// Gets the log format string for an info-level log.
/// </summary>
public static string Info<T>(string action, T obj)
{
var stringBuilder = new StringBuilder(String.Format(
"Action: {0} \tObject: {1} \tUser: {2} \tJson: ",
action, typeof(T).Name, User
));

// Set all virtual properties to null. This should stop circular references of navigation properties.
var virtualProperties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(x => x.GetSetMethod().IsVirtual && !x.PropertyType.IsPrimitive);
foreach (var propInfo in virtualProperties)
{
propInfo.SetValue(obj, null); // This Line is the culprit.
}

GetJsonSerializer().Serialize(obj, stringBuilder);

return stringBuilder.ToString();
}

propInfo.SetValue(obj, null) 如果我只是在循环之前设置断点并逐个单步执行(或只是在该行中断),那么行将执行,但是如果我不这样做如果不使用断点,它永远不会将属性设置为 null。这是为什么?

具体细节:

  • 如果我不使用断点,它就不起作用。
  • 如果我在 foreach 的顶部放置一个断点并按 f5 它不起作用。
  • 如果我在 foreach 的顶部放置一个断点并通过 f10 单步执行,它确实有效。
  • 如果我在代码行 propInfo.SetValue(obj, null); 上放置一个断点,它会起作用。
  • 循环后的断点仍然显示值不为空。
  • 如果我将 null 更改为 5(这不是一个有效值),它会抛出一个异常,告诉我它不是一个有效值。

澄清一下,“不起作用” 意味着它没有将属性设置为 null。

我尝试过的:

  • 重新启动 Visual Studio (2013)
  • 更改代码行(以前是default(T))
  • 项目属性 -> 构建 -> 优化代码(最初关闭)

编辑

已经缩小范围,EF 导航属性是此行为的原因。代码正在运行,但出于某种原因,导航属性拒绝变为空。那么导航属性会导致这种行为吗?

最佳答案

延迟加载

导航属性是延迟加载的,因此当序列化程序查看它们时,它们会被原始值覆盖。所以 null 的设置一直有效,但被延迟加载覆盖了。

调试

调试出现这种情况的原因是因为我在执行 SetValue 代码行之前查看了值。这导致导航属性在执行导致空值未被覆盖的代码行之前加载值。

解决方案

foreach (var propInfo in virtualProperties)
{
propInfo.GetValue(obj); // Trigger any navigation property to load.
propInfo.SetValue(obj, null);
}

关于c# - 除非使用断点单步执行,否则代码行不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33133029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com