基本データ型(値型) | 基本データ型(参照型) | string 型 |
クラスの定義 | thisキーワード |
値型
C#の型には大きく分けて「値型」と「参照型」という二つの形式があります。この二つの違いは、どのようにデータを保存していて、それをどうやって参照するかの違いです。ここでは中でも基本中の基本「値型」を紹介したいと思います。値型というのは、直接メモリにそれにあった領域を確保し、そこに値を読みに行きます。Cなどの普通の「変数」となんら変わりないものです。
型名 | ビット数 | 意味 | 値の形式 |
---|---|---|---|
bool | 1 bit | true もしくは false の値を返す | 真偽値型(なんて呼び方するのかな?) |
char | 16 bit | Unicode文字型 | 文字型 |
byte | 8 bit | 0 〜 255 | 整数型 |
sbyte | 8 bit | -128 〜 127 | |
short | 16 bit | -32,768 〜 32,767 | |
ushort | 16 bit | 0 〜 65,535 | |
int | 32 bit | -2,147,483,648 〜 2,147,483,647 | |
uint | 32 bit | 0 〜 4,294,967,295 | |
long | 64 bit | 64ビット符号付整数 | |
ulong | 64 bit | 64ビット符号無し整数 | |
float | 32 bit | 単精度浮動小数点数型 | 浮動小数点数型 |
double | 64 bit | 倍精度浮動小数点数型 | |
decimal | 128 bit | 財務計算用の数値型 | 貨幣型(とVB時代は呼んでいたような) |
ああ、疲れた。ええ、これだけあります。Cと違うところは多々ありますが、とりあえず「bool」型の説明から…
「bool」型は「true」もしくは「false」の二通りの値しか取れません。スイッチのオン/オフやフラグを立てる際などに良く使われる変数型です。使い方は、「b = true;」とか「b = false;」などと使います。
次は整数型ですが、これはCとほぼ同じなので省略します。Cでは修飾子をつけてintやcharを色々と範囲を変更していましたが、C#では最初から変数型として定義してあります。
浮動小数点数型と文字型もCと同じです。文字型はCと多少違いがあるのですが、これは必要になったときに詳しくお話しすることにします。
最後のdecimal型ですが、小数点以下の数値も正確に計算してくれるため、お金関係の計算をやるのに良く使うらしいのですが、良く分からないので省略します。ってか、普通のプログラムじゃ使わないような気がします。
以上の13種類がC#の値型です。これを基本にプログラムを進めていくのですが、この13種類を全て使うことは少ないと思います。カリカリにコードをチューンして組むのであれば使いこなす必要もありそうですが、趣味でゲームを作る分にはまず必要ないでしょう。僕が必要と考えているのは…bool long int float doubleの五種類程度だと思います。整数は大体intで事足りますし、スイッチのオン・オフをやることが多いゲームプログラムではbool型を良く使います。小数点計算は主に3D系のプログラムで使いますし、スケーリングや三角関数を使うと使います。
最後になりましたが、C#の変数の宣言方法はCと同じです。「int i;」「bool b;」などと宣言します。ただ、変数の有効範囲(スコープ)がCとは感覚的に異なる場合があります。また、C#はスコープを意識してプログラムしないと大変なことになりかねません。このお話はクラスやネームスペースの話が必要になったときに詳しくお話しますが、大体Cと同じものだと思ってください。
参照型
値型とは違い、メモリ上に作られるのはデータの参照先の情報だけで、値自体はメモリの別の場所に作られるのが「参照型」です。つまり、Cでいうポインタみたいな振る舞いをします。そのため、メモリの別の領域にその変数の実体を確保して、その参照を設定する作業をおこなわないといけません。
とりあえず、C#組み込みの参照型を紹介します。
型名 | 意味 |
---|---|
string | 文字列型 |
object | 全参照型のルートクラス |
C#に組み込まれている参照型はこの二つです。このうちよく使うのは「string」型のほうだけです。(多分…)「object」型と言うのは全参照型クラスの基底クラスなのですが…ここで説明するのは怖いので省略。しばらくは知らなくても何とかなると思います。C#では、プログラムを「クラス」というものを基準に作り上げていきます。そしてクラスを作ると言うのは参照型の変数型を定義することに相当します。つまり、C#のプログラムを作っていくうちに参照型はどんどん増えていきます。
string型は文字列を扱う上で非常に便利な型なのですが、高機能で他の参照型とは使い方が異なるため後に大きく取り上げることにして、今回は参照型の変数の宣言の仕方を紹介しておきたいと思います。
変数の宣言自体は基本的に値型と同じなのですが、その後のインスタンス設定(まぁ、ここでは流して…)法と代入の流れを説明しておきます。
例@ object obj; //変数の宣言 A obj = new object(); //インスタンスの設定 |
@で変数を宣言しています。Cで言うとポインタを宣言したのと同じ働きです。次に「new」演算子を使ってインスタンスをメモリ上に生成し、その情報を「=」を使って変数に設定しているのがAの文です。インスタンスと言う言葉はクラスの回で説明したいと思います。
まとめて書くと…object obj = new object(); |
C#を使っていく上で、この「参照」というイメージは非常に大事です。先ほども言ったとおり、C#はクラス設計が基本で、クラスとは参照型変数の定義なのですから。さて、参照型はピープ領域のインスタンス参照情報しか格納されていないわけですから、こんなことをやると…
例Aobject obj; object obj2; obj = new object(); obj2 = obj; |
「obj」も「obj2」も全く同じものを参照していることになります。ここでもし「obj」の値を変更すると自動的に「obj2」の参照先の値も変わってしまいます。こういった場合、インスタンスの数と参照もとの数が異なるため、さらにこの参照の仕組みを理解する必要が出てきますね。ついでに言うと、値型と参照型が入り混じってゴチャゴチャになるとボクシング・アンボクシングなんていう細かい事項がたくさん出てきてしまいますが、今回はイメージを紹介するだけで止めておきます。
これが参照型の概要です。これを使ったテクニックも結構あるようです。あと、ポインタとの違いはC#が安全に管理しているため不正なメモリアクセスが起こらないことでしょう。そのほかにも細かく違うみたいですが、その程度の理解で事足りる気がします。
string 型
「参照型」の回でも紹介しましたが、C#には標準で文字列を扱う型が存在します。それが「文字列型」です。これのおかげで、C#のプログラムを簡単に進めることができるのです!(言いすぎ?)C#のstring型は値型のように感覚的に扱うことができますが、あくまでも参照型であることを忘れないで下さい。
まず、string型変数の作り方を紹介します。
stringオブジェクトの生成string s; s = "abc"; string s = "abc"; |
実際には下の文のように一文で「abc」という文字列を格納したstring型の変数を作成します。string型のインスタンス生成はもちろん「new」演算子を使ってもできるのですが、文字列を直接生成するためには「"」で囲んだ文字列をただ代入すればいいのです。「char」型の配列から文字列を作成するコンストラクタもあるので、charを使う場合はnew演算子を使います。
さて、文字列を扱う型ですから連結や比較なんかも簡単にできます。
文字列の連結string s1 = "abc"; string s2 = "def"; string s = s1 + s2; //文字列の連結 if ( s == "abcdef" ) //文字列の比較 { 〜〜〜〜; }; int i = s.Length; //文字列の長さを取得 |
このように、string型は感覚的に扱えるのです。加えて、string型は「s.Length」とやると格納されている文字列の長さを調べることができます。そのほかにも、stringクラスには文字列を削除したりする静的メソッドもあるので、このページでも随時紹介していくことにします。
クラスの定義
クラスの定義法を紹介します。クラスに関しての詳しい説明はクラス(基本@)をご覧下さい。
クラスの定義方法class クラス名 { //インスタンス変数の宣言 アクセス修飾子 データ型 変数名1; アクセス修飾子 データ型 変数名2; アクセス修飾子 データ型 変数名3; ……… //コンストラクタの宣言と定義 public クラス名 (引数リスト) { //初期化処理 } //メソッドの宣言と定義 アクセス修飾子 戻り値の型 メソッド名1 (引数リスト) { //メソッド内の処理 } アクセス修飾子 戻り値の型 メソッド名2 (引数リスト) { //メソッド内の処理 } アクセス修飾子 戻り値の型 メソッド名3 (引数リスト) { //メソッド内の処理 } ……… } |
クラスは、プログラムの参照型として定義されまキ。よって、定義したクラスを使用するには…
インスタンスの生成クラス名 オブジェクト(変数)名 = new クラス名()〔コンストラクタ〕; |
以上のように、クラスからインスタンスを生成し、そのメンバにアクセスすることで扱うことができます。メンバにアクセスするには、オブジェクト名の後に「.」ドット演算子を使いアクセスします。
メンバへのアクセスオブジェクト名.メンバ名; |
thisキーワード
同じクラス内のメンバにアクセスしたい場合に「this」キーワードを使用します。
thisの例class ex1 { private int x; public ex1() { x = 0; } public static void Main() { ex1 ex = new ex1(); ex.chX(); } public void chX() { this.addx(); } public int getX() { return this.x; } private void addx() { this.x++; } } |
変数にしろ、メソッドにしろ、「this.」と参照することで、同じクラス内のメンバを呼び出すことができます。ただし、この「this.」は基本的に省略することができます。
thisの例(省略してありますが)class ex1 { private int x; public ex1() { x = 0; } public static void Main() { ex1 ex = new ex1(); ex.chX(); } public void chX() { addx(); } public int getX() { return x; } private void addx() { x++; } } |
このように記述しても、全く同じように動作します。詳しい説明はクラス(基本A)で紹介しています。