-1

私はこれまでこれを見たことがありません-C#のポインタ:

public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string> {
    public String(char* value); // <-- string has a constructor that takes a char pointer?
...
}

少し理解してみたいです。

charポインタはC/C ++のポインタのようなものですか、つまりメモリ位置と同じサイズのint値ですか?

また、ポインタを理解していないことが、refキーワードが何をしているのか、つまり、それらが関連しているのかを完全に把握できていないのではないかと思います。

4

3 に答える 3

3

ポインタータイプはC#言語の一部です。これらはCのポインタと同じように機能し、blittableタイプおよびblittableタイプの配列を使用してアンマネージメモリを操作できます。これらはref/outパラメーターとは関係ありません(これらはマネージポインターを使用しますが、これは別のものです)。ポインタを使用すると、誤って使用すると型安全性が損なわれる可能性があるため、安全でない状況でのみ使用できます。

于 2012-04-15T01:07:52.093 に答える
1

私の理解では、ポインタはパフォーマンスの最適化に使用されます。ここでは、「安全でない」フィールドに侵入し、メモリアドレスを直接操作します。

私の経験では、画像処理は、次のようなポインタから大きなメリットを得る分野の1つです。

http://imrannazar.com/Using-Pointers-in-C

安全でないポインタの反復とビットマップ-なぜUInt64の方が速いのですか?

他の典型的なシナリオがあるはずですが、通常のC#アプリケーションは、一般的に言えばポインターを必要としません。

于 2012-04-15T01:17:44.250 に答える
1

C#は、メモリ管理を簡素化してプログラマーに提供するように設計されています。これは、プログラミングをより迅速かつ簡単に行う方法です。ゴミ処理がやって来て、壊れたポインタをすべて殺さなければならないので、それはパフォーマンス(そして怠惰なプログラミング)を犠牲にしてもたらされます。たとえば、ゲームの更新ループでは、これにより、ゴミ処理のために多くのものが作成されます。

       Vector3 myVector;
       void update(int x, int y, int z)
       {
             myVector = new Vector3(x, y, x); //This will kill your Xbox 360 with enough objects
       }

C#では、すべてが参照として保持されます。これは、プログラマーがRAM内のデータを参照する方法が異なるC /C++とは少し異なります。

特に高性能が必要な領域で、プログラマーにより柔軟に提供する方法として、プログラマーはポインターと参照を使用できます。これは、ごみ処理によって管理されなくなったため、「安全でない」変数と呼ばれます。つまり、メモリリークが発生した場合、ゴミ処理は行われず、削除されません。

もう1つの理由は、C#/C++間の互換性のためです。2つの言語間でコードを補間する場合、C#は、C++側で渡されて取得されるポインターに互換性を持たせる方法を知っている必要があることにすぐに気付くでしょう。つまり、C ++コードにポインターを渡したい場合は、

    someInterpatedFunc(ref myVariable);

それがいくつかの質問に答えることを願っています:)

于 2012-04-15T03:49:04.117 に答える