PG日誌スマートフォン用の表示で見るPG日誌2018-10-19C#のクラスと構造体の違い・使い分け方C#C#でクラス(class)と構造体(struct)の違いは何か?それぞれどのような性質があるのか?また使い分け方針の紹介です。使用方法は基本的に同じですが性質が割と違います。双方の性質の違いを考慮し、どちらを使用するかを検討することになります。...と言っても、大抵はクラスしか選択しません。稀に構造体の持つ「値渡し」の性質が必要なケースで構造体を採用するスタイルになるかと思います。宣言時の違いメソッド記述時の違い使用するときの性質どちらを使用するべきか?早速それぞれの特徴を見ていきましょう。宣言時の違いクラスや構造体を宣言する時の違いです。何か指定する必要あり構造体(struct)は継承できないため、継承関係の宣言ができません。インターフェース(interface)だけ指定できます。メンバーの初期値を全部自分で記述する必要があります。以下、少々長いですが各項目のコード例です。この項目に対して有効ではありません。構造体は具象クラスを継承できない。インターフェイスではありません。構造体は抽象クラスを継承できない。インターフェイスではありません。プロパティまたはフィールド初期化子を含めることはできません。構造体に明示的なパラメーターのないコンストラクターを含めることはできません。コントロールが呼び出し元に返される前に割り当てられている必要があります。}}メソッド記述時の違いクラス、構造体共にメソッドが書けます。メソッド宣言時の差異は以下の通りです。privateこちらも構造体(struct)は継承できないことが関係して、継承に関わる宣言がstructではできません。アクセス修飾子を省略したときの既定の値は双方ともにprivateです。宣言されたクラス・構造体を使用する場合の違いは以下の通りです。できない上記の(2)と(5)が最も重要な性質の違いです。メソッド等の引数で構造体を渡すと、値渡し、すなわちコピーが作成されて呼び出し先に渡されます。従ってメソッド内で変更したとしても呼び出し元に変更が反映されまん。メモリ使用量もコピーされて倍になります。構造体は"基本的"にnullにできません。何か値があることが期待できます。(ただし、構造体は"null許容型"としてnullが代入できる形式もあるのであくまで「基本的には」です。)引数では、クラスは参照渡しになるのに対し、構造体は値渡しになります。構造体内のクラスメンバー(class)は参照なので変更が反映されます。全部構造体であれば変更は反映されません。5~12バイト目がlongのように順番にメモリ上に順番に配置されることが期待できます。複合型のレイアウトを参照ください。ヒープに取るとGCが動くまではそのままですが、スタックに取られている場合スコープを抜ければオブジェクトが解放されます。(≒デストラクタの呼び出し)この動作が何かの処理で有利になる事があるかもしれません。構造体はnewしなくてもよい。書かないと以下のように怒られる。割り当てられていない可能性があります。クラスは普通にnullにできる.NETだとintはSystem.Int32、doubleはSystem.Doubleという構造体の別名宣言となっているため、上記の性質を上手に使用しています。冒頭でも述べましたが同じような挙動が必要であれば構造体を選ぶという感じかと思います。どちらを使用するべきか?これまで、性質の違いを見てきましたが、どういうときに構造体を使うのかは、MSDNに「クラスまたは構造体の選択」というタイトルのページがあり*1、詳細な使い分けの方針が書かれています。抜粋すると大凡以下のようになります。頻繁にボックス化しない(=objectにキャストしない)1つのメソッド内で16バイト以下の変更できない型でobject型にキャストしない、とりますが条件がかなり厳しいです。実際、そのようなケースはほぼありませんが、小さいサイズの構造体を狭い範囲で使えばいいことがあるかもしれませんよーって感じだと思います。小さいサイズのオブジェクトを参照で渡したくない時と読み替えてもよさそうです。*1:すぐリンク切れになるのでリンク切れのしてたらタイトルで検索してください。»Profile受託ソフト会社員でWin系業務屋。趣味でCocos2d-x/C++を触っています。etc...主に受託・開発ネタ、Windowsの事、Srellaris、ゲーム制作の進捗の事を喋ります。ArticleC#で2次元配列を管理するクラスを作成する【C#】2次元配列から2次元配列を切り出すC#でオブジェクト初期化子を使った時の丸カッコの有無DOTweenのアニメーションをTimeLineでプレビューするC#の配列をインデックス付きforeachするスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。