2016年2月19日金曜日

C# 構造体とは

こんにちは山田です。

C#の基本構文でいまいち呑み込めなかった部分について
わからないなりに解説をしようと思います。

~良くわかっていない人による解説~
 
開発言語:C#

構造体というのは一見、「何かの構造概念なのか?」と思ってしまいそうなのですが、
(というか勘違いして覚えていたのですが、)
実はクラスに似ていました。
具体的には、メモリ空間における構造が異なるそうです。
なので、ちょっと変わったクラス、というとらえ方でよさそうだと思います。

■構造体の定義

構造体の定義は、クラスとほぼ同じで、structを用いて定義します。
struct Dog{
 public int price;
 public string name;
 public int getPrice(){
    return price
 }

※ちなみに構造体は初期化が出来ないです。
public int kazu =1; ×

クラスと同様に、状態(field)と振る舞い(method)をメンバにもつことが出来ます。

■クラスと構造体の違い
構造体とクラスは似ていますが、
大きな違いは、参照型か値型かの違いです。

●構造体(値型)
 ・構造体は列挙型と同様で、値型です。
  (変数に直接値が格納されているデータ型です。)
 ・他のクラスや構造体を継承したり、継承元になることはできません。
 ・インターフェイスを実装することは可能。
 ・new演算子を使わなくてもインスタンス化される。


●クラス(参照型)

  例:)文字列、配列、クラス、デリゲート、インターフェースが参照型   

■早い話、どういう時に構造体は使用する?

クラスと構造体のどちらを使うか: C# プログラミング 再入門
http://dotnetcsharptips.seesaa.net/article/417085715.html
 ↑
こちらを参考にさせていただきました。
-----------------------------------------------------------------------------
MSDNのプログラミングガイドから引用します。

構造体は軽量オブジェクトを表すのに適しています。参照型の機能が必要ないのなら、小さいクラスとして実装するよりは構造体として定義した方が、システムにより効率的に処理されることが期待できます。

実際に計測してみると(かなりハイスペックなマシンでデバッグビルド版で計測)、上のサンプルコードにあるクラスと構造体とを10万個づつインスタンス化 してもいづれも2msと差はなし。100万回でクラスが約100msに対し構造体が30msと約3倍の効率の良さは伺える。
これらを「参照型の機能」として、つまりBoxingされるようObject型にキャストする処理を介在させた場合、クラスも構造体も120msぐらいであった。

これって、実際の使用条件等を考えるとほとんど構造体を使う理由がないように思えます。
-----------------------------------------------------------------------------

う~んつまり、C#の構造体の場合は、あまり使う場面がないみたいですね。

■参考文献

クラス-構造体-
http://arc360.info/lecture/6/4.html

値型と参照型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
http://ufcpp.net/study/csharp/oo_reference.html

0 コメント:

コメントを投稿