2009-05-18 11 views

答えて

20

C#では、構造体を使用して値型を定義します(classによって宣言された参照型とは異なります)。

C++では、structはデフォルトアクセシビリティレベルがpublicのクラスと同じです。

C#の構造体はC++のクラスとは異なりますが、C#の構造体から派生することはできません。仮想関数を持つことはできません。デフォルトのコンストラクタを定義することはできません。デストラクタなど

+1

C#のstructが値型であるというマーティンの主張は、いくつかの操作でボックス化され、アンボックス化されなければならないため、パフォーマンスにとって非常に重要です。あなたがパフォーマンスについて心配する必要がある場合は、 "ボクシング"をお読みください。 – dss539

11

構造体、C++でより

構造体のためStructs vs Classesを参照してくださいメンバーは、デフォルトでは、公開されていることを除いて、クラスと同じです。 それ以外は、C++の構造体はC++クラスができることすべてを行うことができます。

+2

C#の構造体はコンストラクタを持つことができます。 –

+0

マーク:あなたは私の意図的な間違いを見つけました。 。 。 p.s.私はそれを修正しました:) –

+0

@Marc:彼らはいつもデフォルトのコンストラクタを持っています。自分自身を定義することはできません:-) – MartinStettner

0

はい。 C#で

構造体は、値によって、データの種類(参照によるものであり、OOのものLL持つクラスではなく)デフォルトでは、公開されているだけのクラスであり、C++で

構造体昔ながらのです。

0

管理対象のC++とC#を相互運用しようとしていますか?もしそうなら、これを可能にするC++への拡張があります:link

0

C#structはマネージコードです。誰もそれを参照しなくなったときにC#ガベージによって解放されます。そのデストラクタは、ガベージコレクタがクリーンアップを決定するたびに呼び出されます。

C++構造体はアンマネージオブジェクトであり、自分でクリーンアップする必要があります。デストラクタは、削除するときに予測可能に呼び出されるか、範囲外になります。

+0

C#の構造体はオブジェクトではありません。ガベージコレクションの対象となるものではありません(ガベージコレクションされた型のフィールド、つまりクラスでない限り)。 C#構造体はファイナライザを定義できません: "エラー1クラス型のみがデストラクタを含むことができます" –

+0

ファイナライザについての良い点。しかし、構造体は私が考えるオブジェクトです: "MyStruct is object"はtrueを返します。誰かが構造体が使用するメモリを解放しなければなりません。構造体がヒープ上にある場合、ガベージコレクタはこれを行います。 – Andomar