この章のテーマ §
データの型についての基本的な考え方を説明します。型が違えばデータは違う性質を持ちます。思い通りデータを扱いたいなら、型を理解することは避けて通れません。
前提知識 §
Console.Writeメソッド, 文字列の基礎. メソッドの基礎, 変数の基礎
解説 §
C#では全てのデータが型を持っています。
プログラミング言語の種類によっては型がない場合もありますが、C#は全てのデータに型があります。
型とは、たとえば、【整数(int)】であるとか【文字列(string)】であるとか、あるいはゲームなら【宇宙の帝王】であるとか、ビジネスアプリなら【弊社の事業所間通信システム】であるとか、様々です。システムに組み込まれたものもあれば、利用社側で自由に増やして使う型もあります。整数は普通利用者が自分で定義することはありませんが、【我が社のID】という型は我が社にしかなく、自ら定義して使うしかないのかもしれません。
特定のデータがどんな型に対応しているのかは、GetTypeメソッドを使用すると型に対応する型オブジェクトを取得できるのですぐ分かります。型オブジェクトにFullNameプロパティを使用すると型のフルネームが分かります。
サンプルソースではその方法で型の名前を取得しているので参考にして下さい。
サンプルソースの出力結果に含まれる以下の型はC#に組み込まれた型(int,douboe,stringなど)の【真の名前】です。
- System.Int32=int
- System.Double=double
- System.String=string
【真の名前】を使ってプログラムを書くこともできますが、たいていは別名の短い名前(たとえばint)
を使って書きます。
さて、具体的に型名はどんな点で役に立つのでしょうか。
たとえば、整数型には表現可能な最大値を取得するMaxValueプロパティがありますが、文字列型にはありません。一方で、大文字小文字に変換するToUpper/ToLowerメソッドは文字列型にはありますが、整数型にはありません。
こういう区別を明確に付けるために、型名は役に立ちます。おかげで、コンパイラが【そのデータのその機能はありませんよ】とバグを事前に教えてくれるようになります。
罠の数々 §
- 型名が存在しない匿名の型も存在するが、これにはシステムが記号的な型名を自動的に補っていて、実体として型名がないわけではない。ソースコードに出てこないだけである
- 型名を書く必要のないプログラミング言語が、【効率が良い】と持てはやされることも多いが、実際はデータの種類を明確に指定しないので、トラブルが起きやすい。C#も型名を指定する必要のないdynamic型があるが、使用頻度は多くない
- ToStringメソッドを使うだけで多くの型のフルネームを取得できるが、この方法はたまたまToStringメソッドのデフォルト設定がそうなっているだけで、ToStringメソッドをオーバーライドしている型では使えない。確実に型名を知りたければ、GetType().FullName推奨
参考リンク §
C# の型システム
サンプルソース: typeBasic §
var a = 1;
var b = 1.1;
var c = "Hello";
Console.WriteLine($"{a}の型は{a.GetType().FullName}です。");
Console.WriteLine($"{b}の型は{b.GetType().FullName}です。");
Console.WriteLine($"{c}の型は{c.GetType().FullName}です。");
実行結果 §
1の型はSystem.Int32です。
1.1の型はSystem.Doubleです。
Helloの型はSystem.Stringです。
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
"Console.WriteLine(1.GetType().FullName);"の出力結果を予測してみよう。
- コンパイル・エラー
- 実行時エラー
- 1
- int
- System.Int32
[[解答]]