不行的,请看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;
}
}
无法获取托管类型(“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;
}
}
有想在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
{
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中指针是没有用的而相反引用是适合的操作。