4

私は C# に移行する C++ プログラマーです。私はこの言語を 1 か月間使用し、多くの概念を理解しています。

C++ から C# に移行する際に驚くことはありますか? デストラクタが意図したとおりに実行されないという警告を受けました。最近、T を基本クラスとして使用するジェネリックスで何かをしようとしました。それはうまくいきませんでした。私も別の問題を抱えていましたが、それは C# の経験不足のせいだと思います。また、自分のアプリが RAM を消費していることにも驚きました。それから.dispose、1 つの関数で使用する必要があることがわかりました。(スマートポインターのようにきれいになると思いました)

他に何が私を驚かせるでしょうか?

言語バッシングはご遠慮ください。誰もそうしないとは思いますが、念のため...

4

7 に答える 7

4

幸いなことに、Microsoft はその情報の一部をここに持っています: C# for C++ Developers .

構造体とクラスの違いは、C++ 起源のもう 1 つの大きな問題です。

于 2009-04-23T08:47:16.400 に答える
3

主なものはカバーできたと思います。ガベージ コレクションを読み、デストラクタがない理由を理解し、IDisposableパターン (デストラクタを置き換える種類) を理解する必要があります。それが大きかったと言えます。

もう 1 つ言えることは、C# と .Net ベース クラス ライブラリは非常に大きいことを警告することです。それを最大限に活用するには、学ぶべきことがたくさんあります。ガベージ コレクションの基本とLINQ を確認したい型システム、および自分の領域に関連するライブラリ/フレームワーク (WPF、WCF、ASP.Net など) を時間をかけて調査する必要があります。しかし、それはすべて良いです。私は C++ から C# に移行しましたが、元に戻ることはありませんでした。より生産的であることがわかりました (私は C++ をバッシングしているのではなく、まだやっています :-) )

于 2009-04-23T08:45:53.203 に答える
1

私は数ヶ月前にほぼ同じ変更を加えました (その前に Java に変更を加えましたが、Java のプログラミングにはあまり時間をかけませんでした)。

私が遭遇した最大の罠のいくつかを次に示します。

属性 vs. 変数 vs. セッター

私が陥っていた最大の罠の 1 つは、属性を変更する必要があるか、変数を設定する必要があるか、セッターを使用してクラスの特定の側面を設定する必要があるかを知ることでした。

IList 対 リスト 対 その他のコレクション

IList、List、および他のすべてのコレクションの違いを知ってください(IMOでは、IListではあまりできません)。

ジェネリックには独自の落とし穴があります

そして、多くのジェネリックを使用する予定がある場合は、これを読むと私のエラーのいくつかを回避するのに役立つかもしれません: クラスがジェネリック クラスから派生しているかどうかを確認してください。

しかし、一般的に言えば、変更は非常に簡単に行われたと言えます。

于 2009-04-23T08:52:57.913 に答える
1

C# を使用したことがあれば、言語はまったく異なります。C++ とは異なり、C# には強力なマクロやテンプレート (C# にはジェネリックがあることは認識しています) はありません。記憶に関しては、厳密に制御された環境にいるわけではないことを覚えておいてください。タスク マネージャーや同様のツールで大量のメモリ使用量が表示されることが予想されますが、これは正常な動作です。実際のメモリ使用量を確認するための、より優れた、よりきめ細かいパフォーマンス カウンターがあります。また、あなたが思っているほど dispose を呼び出す必要はないかもしれません (ちなみに、「using」ブロックをまだチェックしていない場合はチェックしてください)。

もう 1 つの明確なものはデフォルトのコンストラクターです。C# では、これは新しい Foo オブジェクトを作成しません。

Foo myFoo;

型オブジェクトの参照を持つようなものだと考えない限り、「void ポインター」のようなものを持つことはできません。同様に、Properties は、C++ 構文で見られるパブリック メンバーではなく、メソッドのシンタックス シュガーと考える必要があります。

「out」および「ref」パラメーターを理解していることを確認してください。

明らかに、これは大きなリストではなく、ほんの数個の「ポインター」です (しゃれた意図はありません)。

于 2009-04-23T08:53:12.547 に答える
0

C++ では利用できず、少し驚くかもしれない言及されていないいくつかのことは、属性リフレクションです。

そのような属性は、本格的なAOPを提供しません。ただし、C++ で解決する方法とは非常に異なる方法で、一連の問題を解決できます。

于 2009-04-23T11:41:59.757 に答える
0

オブジェクト モデルの違い。たとえば、値型と参照型は、インスタンス化された方法ではなく、定義によって分離されます。これにはいくつかの驚きがあります。

myWinForm.Size.Width = 100;

は幅を変更しないため、新しい Size インスタンスを作成して割り当てる必要があります。

于 2009-04-23T08:46:07.120 に答える