gpt4 book ai didi

c# - JObject 正在丢失引用

转载 作者:行者123 更新时间:2023-12-05 04:32:56 27 4
gpt4 key购买 nike

我有 2 个情景来说明这个问题。

场景一

using System;
using Newtonsoft.Json.Linq;

public class Program
{
public static void Main()
{
var arr = new JArray();
arr.Add("apple");
var obj = new JObject();
obj["arr"] = arr;
obj["arr"] = arr;
arr.Add("mango");

foreach(var a in obj["arr"]){
Console.WriteLine(a);
}


}
}

这里的obj["array"] 应该引用arr,也就是更早的初始化。所以输出应该是

apple
mango

但是输出是

apple

场景2

using System;
using Newtonsoft.Json.Linq;

public class Program
{
public static void Main()
{
var arr = new JArray();
arr.Add("apple");
var obj = new JObject();
obj["arr"] = arr;

var obj2 = new JObject();
obj2["arr"] = arr;

arr.Add("mango");

foreach(var a in obj2["arr"]){
Console.WriteLine(a);
}
}
}

同样,obj2["arr"] 应该引用 arr。但事实并非如此。所以预期的输出是

apple
mango

但是输出是

apple

我对 csharp 不是很精通。如果我在这里遗漏了什么,请告诉我。

编辑

添加@Wyck 在评论中提到的另一个场景。

场景 3

using System;
using Newtonsoft.Json.Linq;

public class Program
{
public static void Main()
{
var arr = new JArray();
Console.WriteLine(arr.GetHashCode());
arr.Add("apple");
var obj = new JObject();
obj["arr"] = arr;
Console.WriteLine(obj["arr"].GetHashCode());
obj["arr"] = arr;
Console.WriteLine(obj["arr"].GetHashCode());
obj["arr"] = arr;
Console.WriteLine(obj["arr"].GetHashCode());

arr.Add("mango");

foreach(var a in obj["arr"]){
Console.WriteLine(a);
}


}
}

重复赋值 obj["arr"] = arr 奇数次会返回 arr 的原始引用,但重复偶数次则不会。

这个的输出将是

10465620
10465620
1190878
10465620
apple
mango

看到偶数分配的哈希码发生了变化。对于奇数分配,它又变成了以前的样子。

最佳答案

如果您查看 source code对于 Newtonsoft.Json,你会发现当将一个数组赋给一个属性时,它会创建它的一个副本:

public JProperty(string name, object? content)
{
...
Value = IsMultiContent(content)
? new JArray(content)
: CreateFromContent(content);
}

JObject 的相关部分是here .

您可以通过获取 obj2["arr"]arr< 的哈希码 (.GetHashCode()) 轻松地在您的代码中对此进行测试(均为 JArray 类型)并观察它们会有所不同。

因此,为了能够添加到数组中,您需要在分配属性后通过 JObject 的实例访问它,或者您可以随时将数组重新分配给属性你添加一个元素。

关于c# - JObject 正在丢失引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71561128/

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