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

Related Posts:

  • DOM読み込み時に動作させる $(document).readyこんにちは山田です。 DOMという言葉を最近知りました。 ■DOMとは :XMLやHTMLで記述された文書をプログラムやスクリプトから参照あるいは操作するための方法を提供する仕組み(出典|ASCII.jpデジタル用語辞典) というわけで DOMの読み込み完了時のみに処理をいれたい時に使う関数の… Read More
  • ページネーションに、並び替えや絞り込みがあった場合を調べてみた①こんにちは山田です。 冬至になりましたね。日が短いと観光地が値崩れするので 個人的にはベスト旅行シーズンの到来でウキウキしてしまいます。 さて本日は、 ページネーションについて深堀してみました。 結論からいうとまだよくわかりません。 ■そもそもの目的 SEO対策としてURLの正規化をして、検索… Read More
  • 任意の位置でタブメニューを開いておくこんにちは山田です。 タブ付きのメニューってありますよね。 それを、初期状態で受け取った数字によって、 開始タブを任意に変えることをやりました。 その備忘録です。 タブとそれに紐づくパネルが同時操作されます。 タブの部分は、クラス名に"tabCurrent"があるもの パネル部分は、目的のdivタ… Read More
  • 三項演算子とは?こんにちわ、開発者のⅠです。 山手線の新型車両が11月30日にデビューしたのですが、翌日から運転を取りやめているようです。いつ復帰するのかも現時点では不明とのことで、見切り発車だったとは思いたくないのですが、今後が気になる話です。 さて、今回は三項演算子についてのお話です。 この三項演算子の構… Read More
  • CSSのDisplayプロパティこんにちは山田です。 JSの制御で、 データがない時は、丸ごと消しときたい時ってありますよね その時の実装例です。 件数件 $(function() { $('button').click(function(){ $('div').css('display', … Read More

0 コメント:

コメントを投稿