2012-04-15 5 views
-1

私は前にこれを見たことがない - C#でポインタ: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? 
... 
} 

私は少し理解を得るために興味があります。

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

私は理解ポインタが不足している理由が私は完全には、refキーワードが何を把握していないかどうか、言い換えれば関連しているのだろうか?

+0

を渡すと言います。それはまったく同じことです。 'ref'部分については** MSDN **を読んだり、一度使ってみてください。 – gdoron

+0

これらはメモリ位置です - プロセスアドレス空間内の任意の位置を表すのに十分なバイト数を持つint値、いいえ? –

+0

@gdoron、ええ、私はMSDNが賭けになることがわかりました - 時にはそれは明らかです。私はそこに行って嬉しく思います。私はちょうどstackoverflowに入れて、それは私のための素敵な簡潔な言葉で...これはなぜこのような人気のある場所ですか? –

答えて

1

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

、画像処理が

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

Unsafe Pointer iteration and Bitmap - why is UInt64 faster?

のような他の一般的なシナリオが、通常のC#アプリケーションが存在しなければならない、あなたはポインタから大きな利益を得る分野の一つであります一般的に言えばポインタは必要ありません。

3

Pointer typesはC#言語の一部です。これらはCのポインタと同様に動作し、blittable型とblittable型の配列を持つアンマネージメモリで作業することができます。それらはref/outパラメータに関係しません(これらは管理されたポインタを使用しますが、これは別のものです)。誤って使用すると、ポインタを使用すると型の安全性が損なわれることがあるので、unsafeコンテキストでのみ使用できます。

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#ですべてが参照として保持されています。これは、C/C++とは少し異なります。プログラマは、RAMでデータを参照する方法が異なります。

特に高性能を必要とする分野でプログラマに柔軟に対応する方法として、プログラマはポインタと参照を使用することができます。これは、もはやごみ処理によって管理されていないため、「安全でない」変数と呼ばれます。言い換えれば、メモリリークがある場合、ごみ処理は行われず、削除されません。

もう1つの理由は、C#/ C++との互換性です。 2つの言語の間でコードを補間すると、C#側が渡して得たポインタを互換性を持って提供する方法をC#が知っている必要があることをすぐに理解できます。だから私はC++コードのポインタを渡したい場合は、私はあなたがポインタがC ' `であるかを学ばなければならないいくつかの質問に答える

someInterpatedFunc(ref myVariable); 

希望:)

+0

ありがとうございました! –