Task に名前を追加するコードを書いたことがあります。以下のコードは同じように見えますが、コードが少なくなっています。しかし、それは合法なのだろうか。本番コードの準備はできていますか。ガベージコレクションはどうですか?クラスのインスタンスがコード内で移動されている場合 (固定されていないため) はどうですか?移動しても機能しますか? このコードをテストするにはどうすればよいですか?
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var obj = new object();
obj.Tag("Link some data");
var tag = obj.Tag();
}
}
public static class ObjectExtensions
{
private class Tagger
{
public string Tag { get; set; }
}
[StructLayout(LayoutKind.Explicit)]
private struct Overlay
{
[FieldOffset(0)]
public Tagger Tagger;
[FieldOffset(0)]
public object Instance;
}
public static string Tag(this object obj)
{
var overlay = new Overlay {Instance = obj };
return overlay.Tagger.Tag;
}
public static void Tag(this object obj, string tag)
{
var overlay = new Overlay {Instance = obj };
overlay.Tagger.Tag = tag;
}
}
}