ufcpp / UfcppSample

http://ufcpp.net/ 向けのサンプル
Apache License 2.0
136 stars 39 forks source link

C# 7.3 Custom fixed #191

Closed ufcpp closed 6 years ago

ufcpp commented 6 years ago

VS 15.7 preview 3 の時点でまだできてないんだけど…

https://github.com/ufcpp/UfcppSample/blob/master/Demo/2018/Csharp7_3-0309/ConsoleApp1/Fixed/CustomFixed.cs

http://ufcpp.net/study/csharp/sp_unsafe.html#fixed ここに。

ufcpp commented 6 years ago

そういえば、↓こういう挙動の説明もどこにもない。足した方がいいかも。 要は、null or empty の時に null ポインターが変える。empty でも。

using System;

class Program
{
    static void Main()
    {
        X(default(byte[])); // false
        X(new byte[0]); // false
        X(new byte[1]); // true

        X(default(string)); // false
        X(""); // false
        X("a"); // true
    }

    unsafe static void X(byte[] array)
    {
        fixed (byte* p = array)
        {
            Console.WriteLine(p != null);
        }
    }

    unsafe static void X(string array)
    {
        fixed (char* p = array)
        {
            Console.WriteLine(p != null);
        }
    }
}

これに合わせて GetPinnableReference も「null ポインター相当の ref を返す」という挙動を求められるんだけど… 通常の手段でそれは不可能。現状だと、Unsafe.As(null) が必要になる。

ufcpp commented 6 years ago

http://ufcpp.net/study/csharp/sp_unsafe.html#custom-fixed