当前位置 : 首页 » 互动问答 » 正文

Span <T>不需要局部变量分配。这是一个功能吗?

分类 : 互动问答 | 发布时间 : 2018-04-27 15:05:50 | 评论 : 3 | 浏览 : 269 | 喜欢 : 5

我注意到即使局部变量没有被初始化,下面的代码也会被编译和执行。这是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)
{}

回答(3)

  • 1楼
  • 这看起来像是由引用程序集引起的问题,因为Span<T>具有特定于框架的内部结构,所以是必需的。

    这意味着在引用程序集: 没有字段中(编辑:这不是真的 - 请参阅脚注)。

    A struct如果分配了所有字段,则将其视为分配(用于“明确赋值”),并且在这种情况下,编译器会看到“所有零字段都为零分配:全部好 - 这个变量被赋值“。但是编译器似乎并不知道actual字段,所以它被误导成允许某些技术上不合法的东西。

    你绝对不应该依赖这种很好的行为!虽然在大多数情况下 .locals init 应该表示你实际上并没有得到任何too可怕的东西。然而,目前有一些工作正在进行中,以允许人们在某些情况下is - 我不敢想到在这里的suppress 真的不是场景中会发生什么情况 - 尤其是因为that的工作原理非常像Span<T> - 如果字段ref T初始化为零,可能会产生very very危险。有趣的是,它 .locals init

    。或者,也许sharplab正在使用一个具体的目标框架,而不是引用程序集。这个例子在sharplab : see 编辑:非常奇怪的是,如果我加载引用程序集到可能已经被修复


    或反射器,我可以看到:ildasm .field专用的initonly对象_dummy

    这是引用程序集中的伪造字段,它是

    以阻止这种情况发生,但是......看起来它现在不能很可靠地工作!meant更新:显然这里的区别是出于兼容性原因而保留的


    ;明确赋值结构subtle but known compiler issue本地已知类型的专用字段,但<externalranslate>外部程序集中类型的专用字段considers细微但已知的编译器问题does not consider不考虑

  • 2楼
  • 或多或少,这是由设计决定的,因为如果底层的struct本身包含任何字段,它就会非常依赖。

    这段代码编译例如:

     public struct MySpan <T>
    {
        public int Length => 1;
    }
    
    静态类程序
    {
        static void Main(string [] args)
        {
            MySpan <char> s1;
            var l1 = s1.Length;
        }
    }
    

    但是这段代码没有:

     public struct MySpan <T>
    {
        public int Length {get; }
    }
    
    静态类程序
    {
        static void Main(string [] args)
        {
            MySpan <char> s1;
            var l1 = s1.Length;
        }
    }
    

    似乎在这种情况下,结构是默认的,这就是为什么它不会抱怨缺少赋值。它没有检测到任何字段is错误,正如Marc的回答中所解释的那样。

相关阅读:

Converting string format to datetime in mm/dd/yyyy

Convert HTML to PDF in .NET

Sorting rows in a data table

Best way to read a large file into a byte array in C#?

Run Command Prompt Commands

How do I use Assert to verify that an exception has been thrown?

Merge two (or more) lists into one, in C# .NET

How to open a web page from my application?

Retrieving Property name from lambda expression

What is the default boolean value in C#?