半人前プログラマーの技術談議

開発した物と,C#を入門者向けに解説した記事を書いています!

【C# オブジェクト指向】Object型 プロパティ 匿名型 part2-☆4

calendar

reload

こんにちは!シロウです!

今回はObject型,プロパティ,匿名型について紹介します!

Object型

C#では,全てのクラスがobject型を継承してできたクラスです.

int型,string型もobject型を継承してできたクラスです.

では,object型とは何なのか?

int型の変数から,インテリセンスで表示されるメソッドを確認してみると・・・

6つのメソッドが表示されました.

この中の,

Equals,GetHashCode,GetType,ToStringメソッドは,object型から継承されたメソッドです.(オーバーライドによってint型の仕様に書き換えられています.)

一番わかりやすいToStringメソッドを例に少し説明すると,

ToStringメソッドは,String型(文字列)以外の値をString型に変換するメソッドです.

少し前の言語(C言語など)では,違う型から文字型に変換する時は,文字コードから該当する数値を相互にやりとりして変換するという手順が必要でした.

C#やJavaなどの言語では,あらかじめそのような手順をToStringメソッドという処理にまとめる事により,プログラマ側からは特に複雑な処理を書かずとも簡単に実装できるようになっています.

必要なときに,必要な処理,変数,物を持ってきて使う,これがオブジェクト指向の考え方です.(object型はオブジェクト指向そのものです.)

windowsフォームでGUIアプリケーションを作成する時に出てくるラベルやボタンもオブジェクトの1つです.全てobject型を継承してできたクラスです.

object型の変数には,任意の型の値(クラスのインスタンスも可)を代入する事ができます.(メモリやボックス化などの話になるので,詳しくはデータ型で説明しようと思います.)

 

プロパティ

プロパティ

プロパティは,クラス内部から見るとメソッドのように扱われ,クラス外部から見るとメンバ変数のように扱われるものです

簡単に言うと,

この一連の処理を1つにまとめることです.

この機能は,C#(VB)にしかない機能ですが,結構便利です.

プロパティは,次のように記述します.

setの部分をsetアクセサー(setter),getの部分をgetアクセサー(getter)といいます

また,バッキングフィールドと呼ばれるprivate 変数を用意しておく必要があります

 

 

 

実行結果

 

Programクラスから,setアクセサーを呼び出した場合,右辺の値はvalueに格納されます.

 

set,getで異なるアクセスレベルを設定

setアクセサー,getアクセサーで異なるアクセスレベルを設定できます.

設定できるのは,片方のみなので注意.(そもそもプロパティがpublicなので,指定していない方はpublicになります.)

 

自動実装プロパティ

自動実装プロパティは,バッキングフィールドが無くても使う事ができるプロパティです

自動実装プロパティは,次のように記述します.

例えば,次のように記述すると,

下記のプログラムと同じ処理をしています.(__Age変数はコンパイラによって生成される変数なので,コード上では直接参照する事はできません.)

 

Humanクラスを次のように書き換えて実行してみます.

 

実行結果

 

2行だけで先程のプログラムと同じ結果になる事が確認できます.

 

getonlyプロパティ

getonlyプロパティは,getアクセサーのみ定義するプロパティです

getonlyプロパティは,コンストラクタでのみ値を設定(代入)する事ができます.

 

 

実行結果

 

プロパティ初期化子

プロパティ初期化子は,自動実装プロパティに対して初期化子を与えることができます

クラス内部での宣言なので,使いどころは限られると思います.

 

匿名型(匿名クラス)

new演算子

匿名型に入る前に,new 演算子について説明します.

new 演算子は,クラスのインスタンスを生成する時,配列の要素数を宣言する時に使いました.

実は,クラスのインスタンスを生成する時に,動的にメモリ確保をし,オブジェクトを作成しています.(配列も同様です.(配列もクラスなので.))

これが,new 演算子の役割です.

 

匿名型

匿名型は,型の定義をせず利用する型のことです

匿名型は,var キーワード,new 演算子を使って次のように記述します.

クラス名が無い状態なので,varを使っているわけですね.

ここで宣言したプロパティは,全て自動実装プロパティになります

 

 

実行結果

 

 

今回はここまで!

次回はインタフェース同士の継承について紹介します.