我有两个场景来展示这个问题。
场景一
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
方案二
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
奇数次会得到原始引用,但偶数次不会。输出结果将是:
10465620
10465620
1190878
10465620
apple
mango
观察到偶数赋值后哈希码发生了变化,但是奇数赋值后哈希码又恢复原样。