Csharp/C#教程:为什么不引用循环检测使用引用相等?分享


为什么不引用循环检测使用引用相等?

序列化下面的对象时,Json.Net检测到一个自引用循环并抛出exception。

该课程有两个重要特征:

 public class Foo { public int Value { get; set; } public Foo Child { get; set; } public override bool Equals(object obj) => (obj as Foo).Value == this.Value; public override int GetHashCode() => this.Value.GetHashCode(); } ... var foo = new Foo { Value = 42, Child = new Foo { Value = 42 } }; JsonConvert.SerializeObject(foo); // Throws JsonSerializationException 

似乎Json.Net使用Equals()的覆盖来检测参考循环(通过调试确认)。 但这里没有循环。

为什么不使用引用相等来检查引用循环?

我发现了一个测试,certificate可以提供一个使用引用相等的不同EqualityComparer ,但我很想知道为什么这不是默认行为。

Newtonsoft在问题#401中明确地解决了这个问题:在检查循环引用时应该使用对象引用相等性

我更喜欢当前的行为,它允许开发人员通过重写Equals来定制逻辑。

此外,这是一个巨大的突破性变化。

但后来补充道:

将EqualityComparer添加到JsonSerializer 3cc797c 。

此增强function添加了对JsonSerializerSettings.EqualityComparer支持,它允许调用object.Equals在参考循环检测中的默认行为在设置中被覆盖:

public IEqualityComparer EqualityComparer { get; set; }

获取或设置比较引用时序列化程序使用的相等比较器。

上述就是C#学习教程:为什么不引用循环检测使用引用相等?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/957049.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐