我曾經寫過一張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