6

VB6 の AddressOf 演算子に関する C# の代替ソリューションを手伝ってくれる人はいますか? AddressOf は長い値を返します。C# で出力を取得するにはどうすればよいですか?

4

4 に答える 4

11

Harper Shelbyの答えを拡張すると、はい、それは可能ですが、.NETでそうするのは一般的にコードの匂いです。

C# で変数のアドレスを取得するには、C スタイルのポインター (*) /アドレス (&) / 逆参照 (->) 構文を使用できます。これを行うには、/unsafe コンパイラ スイッチを使用してアプリをコンパイルする必要があります。これは、メモリ アドレスを直接処理し始めるとすぐにマネージ コードのセーフティ ネットから飛び出してしまうからです。

MSDN のサンプルは、ほとんどのことを物語っています。

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

numberこれにより、変数のアドレスが pointer-to-an-int に割り当てられますp

これにはいくつかの問題があります。

  1. アドレスをフェッチする変数は、初期化する必要があります。デフォルトである値型の問題ではありませんが、参照型の問題です。
  2. .NET では、意識せずに変数がメモリ内を移動する可能性があります。変数のアドレスを処理する必要がある場合はfixed、変数を RAM に固定するために使用する必要があります。
  3. & は変数にのみ適用でき、定数や値には適用できません。(つまり、 のような構造を使用することはできませんint* p = &GetSomeInt();)
  4. 繰り返しになりますが、コードはアンセーフ モードでコンパイルする必要があります。これにより、マネージ コードの "セーフティ ネット" の外部で機能を使用することを CLR に通知します。

一般的に、この世界での私のアドバイスは、.NET の世界でこれを行う必要があると考える理由を真剣に検討することです。.NET の使命の 1 つは、開発者が金属に反対するのを防ぐことでした。この機能は、その使命に反するものです。それが必要な (まれな) シナリオのために存在します。単にできるという理由だけで軽薄にこれを使用していることに気付いた場合は、おそらくそれを誤用しており、コードの臭いが発生しています。

可能であれば避けてください。ただし、どうしても必要な場合は、使い方を知っておいてください。

于 2008-11-11T14:56:25.670 に答える
6

C# には、関数をデリゲート/イベントに割り当てるための特別な構文があります。使うだけ<delegate> += <function>;

実際に他の用途のためにアドレスを取得しようとしている場合は、運が悪い. マネージ コードに関する問題の 1 つは、これらのアドレスが必ずしも固定されていないことです。ほとんどの機能が変更される可能性は低いですが、変更が可能な状況もあります。

于 2008-11-11T14:05:26.020 に答える
2

どうやら、これは実行できるようです (ただし、どこで必要になるかはわかりません)。これがMSDN ページです。

于 2008-11-11T14:06:55.520 に答える
0
EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
    // ....
}

どちらの表記も同等です。

于 2008-11-11T14:06:59.030 に答える