1

私は基本的に C# に挑戦しようとしている C++ の男です。C# の基本的なチュートリアルから、すべてのオブジェクトが動的に作成および格納され (Java の場合も同様)、参照によってアクセスされるため、コピー コンストラクターは必要ないことがわかりました。オブジェクトを関数に渡したり、関数からオブジェクトを返したりするときにも、ビットごとのコピーは必要ありません。これにより、C# は C++ よりもはるかに単純になります。

ただし、参照を介して排他的にオブジェクトを操作すると、実行できる操作の種類に制限が課され、プログラマーが完全に制御できなくなることをどこかで読みました。制限の 1 つは、オブジェクトをいつ破棄できるかをプログラマが正確に指定できないことです。

誰かが他の制限について詳しく説明してもらえますか? (必要に応じてサンプルコード付き)

4

3 に答える 3

2

「制限」のほとんどは、欠陥と見なされるのではなく、設計によるものです (もちろん同意しない場合があります)。

判断できない/気にする必要はない

  • オブジェクトが破壊されたとき
  • オブジェクトがメモリ内にある場所
  • どれくらい大きいか (アプリケーションを調整している場合を除く)
  • ポインター演算の使用
  • オブジェクトの外側にアクセスする
  • 間違った型のオブジェクトにアクセスする
  • スレッド間でのオブジェクトの共有はより簡単です
  • オブジェクトがスタック上にあるかヒープ上にあるか。(スタックは Java でますます使用されています)
  • メモリの断片化 (これはすべてのコレクターに当てはまるわけではありません)
于 2013-01-11T10:12:59.010 に答える
1

Javaで行われるガベージコレクションのため、オブジェクトがいつ破棄されるかを予測することはできませんが、デストラクタの機能を実行します。

一部のリソースを解放したい場合は、finallyブロックを使用できます。

try {


  } finally{
  // dispose resources.     
  }
于 2013-01-11T10:01:55.443 に答える
0

同様の移行を行った後、詳しく調べれば調べるほど、最も単純なケースを除いて、C# の GC 動作について考える必要が生じます。これは、マネージ コードからアンマネージ リソースを処理しようとする場合に特に当てはまります。

この記事では、あなたが関心を持つ可能性のある多くの問題を強調しています。

個人的には、 IDisposable (shared_ptr のようなもの)の参照カウントの代替手段が恋しいですが、それはおそらく C++ のバックグラウンドからの二日酔いです。

C++ のようなプログラミングをサポートするために独自の配管を作成する必要があるほど、見落としていた別の C# メカニズムが存在する可能性が高くなり、C# に不満を感じるようになります。たとえば、swapmoveは、私が見た限りでは C# の一般的なイディオムではなく、それらが恋しいです。C# のバックグラウンドを持つ他のプログラマーは、これらのイディオムがどれほど有用であるかについて意見が分かれるかもしれません。

于 2013-01-11T10:20:38.433 に答える