【问题标题】:AddressOf alternative in C#C# 中的 AddressOf 替代方案
【发布时间】:2008-11-11 14:01:58
【问题描述】:

任何人都可以帮助我使用 C# 中关于VB6 中的AddressOf 运算符 的替代解决方案吗? AddressOf 返回一个长值。我可以通过什么方式在 C# 中获取输出?

【问题讨论】:

标签: c# address-operator


【解决方案1】:

扩展 Harper Shelby 的回答,是的,可以做到,但在 .NET 中这样做通常是一种代码味道。

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

来自 MSDN 的示例讲述了大部分故事:

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

这会将number 变量的地址分配给指向整数的指针p

这里有一些问题:

  1. 必须初始化您要获取其地址的变量。对于默认值类型不是问题,但对于引用类型是问题。
  2. 在 .NET 中,变量可以在您不知道的情况下在内存中移动。如果你需要处理变量的地址,你真的想使用fixed将变量固定在RAM中。
  3. & 只能应用于变量,不能应用于常量或值。 (换句话说,你不能使用像int* p = &GetSomeInt(); 这样的结构)
  4. 同样,您的代码必须在不安全模式下编译,这会向 CLR 标记您将使用托管代码“安全网”之外的功能。

一般来说,我在这个世界上的建议是认真考虑为什么你认为你需要在 .NET 世界中这样做。 .NET 的任务之一是保护开发人员免于与金属作对,而此功能与该任务背道而驰。它存在于那些需要它的(罕见的)场景中;如果您发现自己只是因为可以而轻率地使用它,那么您可能会误用它并引入代码异味。

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

【讨论】:

    【解决方案2】:

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

    如果您实际上是在尝试获取该地址以作其他用途,那么您就不走运了。托管代码的其中一件事是这些地址不一定是固定的。虽然大多数功能不太可能发生变化,但在某些情况下是可能的。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        EventHandler handler1 = this.button1_Click;
        EventHandler handler2 = new EventHandler( this.button1_Click );
        ...
        ...
        ...
        void button1_Click( object sender, EventArgs e ){
            // ....
        }
        

        这两种表示法是等价的。

        【讨论】:

          猜你喜欢
          • 2018-02-06
          • 2011-08-24
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多