是否可以在C#中使用转换后的指针值的引用返回?

问题描述 投票:2回答:1

使用转换后的指针值的参考返回值可以吗?

我已经阅读了这个问题。How is return by reference implemented in C#?

关于垃圾收集器的内存移动问题,可以使用下面的代码吗?(Helper.GetReference()和Helper.GetPointer())

class Program
{
    static unsafe void Main(string[] args)
    {
        byte[] bytes = new byte[1024];

        ref SomeStruct reference = ref Helper.GetReference<SomeStruct>(bytes);
        reference.field1 = 1;
        reference.field2 = 2;

        SomeStruct* pointer = Helper.GetPointer<SomeStruct>(bytes);
        pointer->field1 = 3;
        pointer->field2 = 4;
    }
}

public static class Helper
{
    // Can I use this?
    public static unsafe ref T GetReference<T>(byte[] bytes) where T : unmanaged
    {
        fixed (byte* p1 = bytes)
        {
            T* p2 = (T*)p1;
            return ref *p2;
        }
    }

    // Shouldn't I use it?
    public static unsafe T* GetPointer<T>(byte[] bytes) where T : unmanaged
    {
        fixed (byte* p1 = bytes)
        {
            return (T*)p1;
        }
    }
}

public struct SomeStruct
{
    public int field1;
    public int field2;
}
c# reference return fixed ref
1个回答
2
投票

据我所知,这两个方法都是不安全 ...是的,但是确实可以编译,因为您在unsafe方法中使用了Helper并引用了相同的内存,因此安全-net已被删除。

指向到可以由垃圾收集器(又名数组)移动的一部分内存(托管对象),可能使您留下悬挂指针] >

您需要在fixed方法中fix

Main)数组以确保安全(以我的方式看)或您的结构

例如

fixed (SomeStruct* fixedPointer = &Helper.GetReference<SomeStruct>(bytes))
{
    fixedPointer->field1 = 5;
    fixedPointer->field2 = 6;
}

fixed (byte* p = bytes) // even though p isn't being used
{
   SomeStruct* pointer = Helper.GetPointer<SomeStruct>(bytes);
   pointer->field1 = 3;
   pointer->field2 = 4;
}
© www.soinside.com 2019 - 2024. All rights reserved.