public static void UserDataStorageGetOrSet()
        {
            string ToStr(int value) => value.ToString();

            var obj  = new object();
            var slot = UserDataSlot <string> .Allocate();

            Equal("42", obj.GetUserData().GetOrSet(slot, 42, ToStr));
        }
        public static void UserDataStorageGetOrSetSimpleFactory()
        {
            string CreateString() => "Hello, world!";

            var obj  = new object();
            var slot = UserDataSlot <string> .Allocate();

            Equal("Hello, world!", obj.GetUserData().GetOrSet(slot, CreateString));
        }
        public static void UserDataStorage()
        {
            var slot = UserDataSlot <long> .Allocate();

            var str = new string('a', 3);

            str.GetUserData().Set(slot, 42);
            Equal(42, str.GetUserData().Get(slot));
            str = null;
            GC.Collect();
            GC.WaitForFullGCComplete();
            str = new string('a', 3);
            Equal(0, str.GetUserData().Get(slot));
        }