我曾经写过一张code to add a name to a 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;
}
}
}
今天晚上我花了一些时间看这个问题,并发现了一些有趣的事情:改变'Tagger'为一个结构似乎迫使CLR将数据写入Overlay结构共享的对象的末尾,那里显然不好。同样,如果原始对象是一个'int []'的数组,并且一个'int'被写入'Tagger',则从起始指针开始的64字节的内存中会包含一些连续的数字(一个int [3]这个数字是+60)从第一个整数,但如果写了其他任何东西,该数字是相同的第一个整数...这真的很酷。 – Scott