Изменить: Мне хорошо известно, что это очень хорошо работает с типами значений, мой конкретный вопрос заключается в использовании этого для ссылочных типов.
Edit2: Я также знаю, что вы не можете накладывать типы ссылок и типы значений в структуре, это просто для случая перекрытия нескольких полей ссылочного типа друг с другом.
Я занимался структурированием в .NET/С#, и я только узнал, что вы можете это сделать:
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1 {
class Foo { }
class Bar { }
[StructLayout(LayoutKind.Explicit)]
struct Overlaid {
[FieldOffset(0)] public object AsObject;
[FieldOffset(0)] public Foo AsFoo;
[FieldOffset(0)] public Bar AsBar;
}
class Program {
static void Main(string[] args) {
var overlaid = new Overlaid();
overlaid.AsObject = new Bar();
Console.WriteLine(overlaid.AsBar);
overlaid.AsObject = new Foo();
Console.WriteLine(overlaid.AsFoo);
Console.ReadLine();
}
}
}
В основном обходимо выполнять динамическое кастинг во время выполнения, используя структуру, которая имеет явный формат поля, а затем обращается к объекту внутри по мере его правильного типа.
Теперь мой вопрос: может ли это привести к утечке памяти каким-либо образом или к любому другому undefined поведению внутри CLR? Или это полностью поддерживаемое соглашение, которое можно использовать без каких-либо проблем?
Я знаю, что это один из более темных уголков CLR, и что этот метод является всего лишь жизнеспособным вариантом в очень немногих конкретных случаях.