使用MemoryMarshal.GetReference

时间:2018-10-08 12:25:09

标签: .net-core c#-7.2

过去几天,我一直在学习新的C#7.2 ref readonly返回值和in结构参数。这样做时,我遇到了一个问题,该问题已通过使用单元测试的简单解决方案在此处概述:

https://github.com/Mike-EEE/StructureReferences

我有四个单元测试大致上证明了这个问题,其中两个使用MemoryMarshal.GetReference(一个测试失败的焦点区域),两个使用常规的可分配本地字段(两个测试均按预期通过)。

在所有单元测试中,我采用一个单独的readonly struct字段在本地分配的Structure(命名为uint)中并将其传递给使该字段递增并返回新的{ {1}}。

这是我使用struct进行测试的目的:

MemoryMarshal

对于本地可分配字段:

static ref readonly Structure Add(in Structure parameter)
{
    var structure = new Structure(parameter.Count + 1);
    var span      = MemoryMarshal.CreateReadOnlySpan(ref structure, 0);
    return ref MemoryMarshal.GetReference(span);
}

对于ref readonly Structure AddFromLocal(in Structure parameter) { _local = new Structure(parameter.Count + 1); return ref _local; } ,如果我将对MemoryMarshal.GetReference方法调用的调用结果分配给局部变量,则测试通过:

Add

但如果我内联结果,则不会:

[Fact]
public void Assignments()
{
    var one   = Add(_structure);
    var two   = Add(one);
    var three = Add(two);
    three.Count.Should().Be(3);
}

我的问题是:这是预期的行为吗?如果是这样,为什么? :)在我看来,如果将引用传递给另一个方法,然后将其传递给另一个方法([Fact] public void Inline() // Doesn't pass. { Add(in Add(in Add(in _structure))).Count.Should().Be(3); } ),它将像其他测试(和本地现场测试)一样不受阻碍地返回。忍耐。

任何关于这两种测试为何结果不同的解释将不胜感激。

0 个答案:

没有答案