不行的,请看MSDN中的说法
无法获取托管类型(“S”)的变量地址或大小即使与 unsafe 关键字一起使用,也不允许获取托管对象的地址。下面的示例生成 CS0208:// CS0208.cs
// compile with: /unsafeclass S
{
   public int a = 98;
}public class a
{
   unsafe public static int Main()
   {
      S s = new S();  // S is managed
      S * s2 = &s;    // CS0208
      return 1;
   }
}

解决方案 »

  1.   

    发送者 windfast_2000 
    有想在C#中取得变量的地址,我想只有使用非安全代码,因为这样可以使用指针
    用IL就很容易解决了,写了个例子:
    .assembly print{}
      .class public auto ansi print
             extends [mscorlib]System.Object
      {
           .method public static void  say() cil managed
           {
           .entrypoint
           .maxstack  1
           .locals init(int32 var,
                     int32 addr)
           ldloca.s  var
           stloc.s  addr
           ldloca.s addr
           call       instance string [mscorlib]System.Int32::ToString()
           call       void [mscorlib]System.Console::WriteLine(string)
           ret
           }
      }
    发送者 windfast_2000 
      

  2.   

    问题是,你要这个地址干什么?在GC环境下,在你取得地址的下一条指令,对象就有可能被移动,导致该地址无效。.NET允许你固定一些对象,在C#里面是fixed语句,但只能用于数组、字符串和ValueType成员。另一个原因是,即使你得到了Heap里面某个对象的地址,你仍然不能访问它的任何成员。因为你无从得知对象在内存中的具体布局。windfast_2000的例子仍然是在操作valuetype,而且是Local变量,不在Heap里面。
      

  3.   

    其实,这个问题,我给个例子你int i=0;for(int j=0;j<5;j++)
    {
       byte[]sixteenBytes=new byte[16];
     unsafe

      fixed(byte *b=sixteenBytes)
    {
        Console.WriteLine("Memory address 0x{0:X},0x{1:X}",(int)b,(i==0)?0:(int)b-i);
        i=(int)b;
    }
    }
    }
    如果,你观察指针地址的变化,你会发现,每次新分配的对象,都会是地址发生变化因此你要地址有什么意义呢?关于更多参考,可以去参阅相关资料。再次声明CLR中指针是没有用的而相反引用是适合的操作。