地址替代C#中的替代

时间:2008-11-11 14:01:59

标签: c# address-operator

对于C#中有关 VB6中的AddressOf运算符的替代解决方案,有没有人可以帮助我? AddressOf返回一个long值。我可以通过什么方式获得C#中的输出?

4 个答案:

答案 0 :(得分:11)

扩展Harper Shelby的答案,是的,它可以完成,但在.NET中这通常是代码味道。

要在C#中获取变量的地址,可以使用C样式指针(*)/地址(&)/解除引用( - >)语法。为此,您必须使用/ unsafe编译器开关编译应用程序,因为一旦开始直接处理内存地址,就会从托管代码的安全网中弹出。

来自MSDN的样本讲述了大部分故事:

int number;
int* p = &number;
Console.WriteLine("Value pointed to by p: {0}", p->ToString());

这会将number变量的地址分配给指向-n-int p的指针。

有一些问题:

  1. 必须初始化要获取其地址的变量。值类型不是问题,默认情况下,但它是引用类型的问题。
  2. 在.NET中,变量可以在内存中移动而不会被您意识到。如果你需要处理变量的地址,你真的想用fixed将变量固定在RAM中。
  3. &安培;只能应用于变量,而不是常量或值。 (换句话说,您不能使用像int* p = &GetSomeInt();
  4. 这样的结构
  5. 同样,您的代码必须以不安全模式编译,该模式标记您将使用托管代码“安全网”之外的功能的CLR。
  6. 一般来说,我在这个世界上的建议是认真考虑为什么你认为你需要在.NET世界中这样做。 .NET的任务之一是保护开发人员不要违背金属,这个功能与这个任务背道而驰。它适用于需要它的那些(罕见)场景;如果你发现自己只是因为你可以轻率地使用它,你可能会误用它并引入代码味道。

    尽可能避免使用,但如果绝对必要,请知道如何使用它。

答案 1 :(得分:6)

C#具有为委托/事件分配函数的特殊语法。只需使用<delegate> += <function>;

即可

如果你真的试图获得其他用途的地址,那你就不走运了。托管代码的一个问题是这些地址不一定是固定的。虽然大多数功能都不可能发生变化,但有可能存在这种情况。

答案 2 :(得分:2)

显然,这可以做到(虽然我不确定你需要它在哪里)。 这是MSDN page

答案 3 :(得分:0)

EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
    // ....
}

两种表示法都是等效的。