gpt4 book ai didi

.net - 为什么 CLR 重用空字符串,而不重用空数组?

转载 作者:行者123 更新时间:2023-12-03 22:35:01 25 4
gpt4 key购买 nike

我注意到

Console.WriteLine((object) new string(' ', 0) == (object) new string(' ', 0));

版画 true ,这表示 CLR 保留空字符串并重新使用相同的实例。 (它打印 false 用于除 0 之外的任何其他数字。)

但是,数组并非如此:
Console.WriteLine(new int[0] == new int[0]);   // False

现在,如果我们看一下 Enumerable.Empty<T>() 的实现,我们发现它缓存并重用了空数组:
public static IEnumerable<TResult> Empty<TResult>()
{
return EmptyEnumerable<TResult>.Instance;
}

[...]

public static IEnumerable<TElement> Instance
{
get
{
if (EmptyEnumerable<TElement>.instance == null)
EmptyEnumerable<TElement>.instance = new TElement[0];
return EmptyEnumerable<TElement>.instance;
}
}

因此框架团队认为为每种类型保留一个空数组是值得的。如果 CLR 愿意,它可以更进一步并在 native 执行此操作,因此它不仅适用于对 Enumerable.Empty<T>() 的调用。还有 new T[0] .如果优化在 Enumerable.Empty<T>()值得吗,难道这会更值得吗?

为什么 CLR 不这样做?有什么我想念的吗?

最佳答案

字符串可能会使用实习,这使它们成为一个不同的故事(与所有其他类型的对象)。

数组本质上只是对象。重新使用语法或上下文中不清楚的实例并非没有副作用或风险。

static int[] empty = new int[0];
...
lock (empty) { ... }

如果其他一些代码锁定另一个(他们认为)空 int[]您可能会遇到一个很难找到的僵局。

其他场景包括使用数组作为字典中的键,或者其他任何它们的身份很重要的地方。该框架不能只是改变规则。

关于.net - 为什么 CLR 重用空字符串,而不重用空数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7915669/

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