gpt4 book ai didi

c# - Span 不需要局部变量赋值。那是一个功能吗?

转载 作者:可可西里 更新时间:2023-11-01 09:16:01 26 4
gpt4 key购买 nike

我注意到即使局部变量没有初始化,下面的代码也会编译和执行。这是 Span 的特性吗?

void Uninitialized()
{
Span<char> s1;
var l1 = s1.Length;

Span<char> s2;
UninitializedOut(out s2);
var l2 = s2.Length;
}

void UninitializedOut(out Span<char> s)
{}

最佳答案

这看起来像是由引用程序集引起的问题,由于 Span<T> 的方式而需要。具有特定于框架的内部结构。

这意味着在引用程序集中:没有字段(编辑:这不完全正确 - 参见脚注)。

A struct如果所有字段都已分配,则被视为已分配(出于“明确分配”的目的),在这种情况下,编译器会看到“已分配零字段中的所有零:一切都很好 - 此变量已分配”。但编译器似乎并不了解实际 字段,因此它被误导而允许某些技术上无效的内容。

你绝对不应该依赖于这种表现得很好!虽然在大多数情况下.locals init应该意味着你实际上没有得到任何可怕的东西。但是, 目前正在进行一些工作,以允许人们抑制 .locals init在某些情况下 - 我害怕想到这里的那个场景会发生什么 - 特别是自 Span<T>工作起来很像 ref T - 如果字段真的没有初始化为零,那可能会变得非常非常危险。

有趣的是,它可能已经修复:参见this example on sharplab .或者,也许 sharplab 使用的是具体的目标框架,而不是引用程序集。


编辑:非常奇怪,如果我将引用程序集加载到 ildasm 中或反射器,我可以看到:

.field private initonly object _dummy

这是引用程序集中的欺骗字段,旨在阻止这种情况发生,但是......看起来它现在工作得不是很可靠!


更新:显然这里的区别是 subtle but known compiler issue出于兼容性原因保留;结构的明确赋值考虑本地已知类型的私有(private)字段,但不考虑外部程序集中类型的私有(private)引用类型字段。

关于c# - Span<T> 不需要局部变量赋值。那是一个功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49771391/

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