ここではC#の型について学びます。
型(type) の概念
変数や定数、評価式の結果など、C#では存在する値の全てに型があります。
さらにC#は厳密に型指定された言語となり、異なる型の扱いに非常に厳しいです。
数値型で用意した変数に文字列を代入する処理を認める言語もありますが、C#ではこのような処理は認められません。
故に型を理解することはC#では必須の知識になります。自分がどんな型を扱ってるか常に把握しましょう。
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
C#において型を間違えようものならボコボコにされます。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
もうちょっとマシな表現ないんですか。
型が保存する情報
現時点の知識では少し難しいので、軽い気持ちで聞いてください。
型には以下の決められた情報が保存されてます。
- 型が必要とする記憶領域
- 表現可能な最大値と最小値
- 所有するメンバ (フィールド、メソッド、イベントなど)
- 継承元の基本型
- 実装されたインターフェイス
- 許可される演算の種類
簡単に説明するならプロフィールみたいなものです。型ごとに決められた設定があって、その情報を所有してます。
この中でも最初に知っておくべきは1番と2番です。型にはサイズがあり、それに伴い表現可能な最大値と最小値が決まります。
その他の項目はクラスの概念を理解しないと説明できないので、現時点では気にしなくていいです。
POINT型ごとに表現可能な最大値と最小値が決まっている。
型のサイズ
全ての型にはbyte単位でサイズが設定されてます。
ここでは一例として、数値を表現できるint型を使って説明しましょう。
int型は4byte(32bit)のサイズを持ち、符号付きのデータを保存します。
つまり-2,147,483,648 ~ 2,147,483,647の値を記録することができるのです。
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
この時点で分からない人は僕のコンピュータサイエンス講座を読むことをオススメします。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
コンピュータの基礎はプログラミングを理解するために必要だよ!
コンピュータサイエンスを学習できる記事をまとめました。このページから関連する記事にアクセスできます。日本語では情報工学と言って、コンピュータに関する基礎知識です。たぶん、情報系の大学や専門学校で習います。正直、現代のコンピュータはプログラミングを含めて難易度が下がってるので、この辺の知識が無くても普通に生きていけます。では、なぜ学ぶのでしょうか。それは単に知ってることで有利な場面が多いからです。理解できなくても1回学ぶと記憶に残ります。何も知らないゼロよりも価値があるとは思いませんか? ...
本題に戻りましょう。int型におけるこの仕様は絶対の決めごとです。
そして他の型においても仕様は存在し、C#におけるルールとして決まってます。
値型(Value type) と参照型(Reference type)
C#の型は大きく2種類に分類されます。それが値型と参照型です。
正直、現時点では難しいので、そんなもんかの理解でいいです。
関数(※1)を学んだことで、ついに値型と参照型の違いを知ることができます。ここではC#で最重要とも言える値型と参照型の違いを理解しましょう。※1現在の知識を踏まえて、ここではメソッドではなく関数と呼びます。値型と参照型の復習まずは値型と参照型について復習しましょう。この2つは値を保存する場所が大きなポイントになります。値型値型とは用意した領域に直接的に値を保存します。参照型参照型は値を別の領域に格納し、それを...
この値型とは用意したメモリ領域に直接的に値を保存します。
![値型](https://takemi.blog/wp-content/uploads/2023/09/C8A14C7B9F2944878716E8BB4A24D9A2_0001.webp)
対して参照型は値を別のメモリ領域に格納し、それを示す参照値(アドレス)を使って操作します。
![参照型](https://takemi.blog/wp-content/uploads/2023/09/C8A14C7B9F2944878716E8BB4A24D9A2_0002.webp)
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
そうなってるメリットが分かりません。
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
この段階で説明するのは凄く難しいから、C#には値型と参照型が存在することを知ってほしいな。
POINTC#の型は大きく値型と参照型の2種類に分類される。
組み込み型(Built-in type)
C#に予め組み込まれてる型です。さっき紹介したint型も組み込み型の一種です。
具体的には整数、浮動小数点値、文字列、真偽値など、色々あります。
ポイントとなるのは予め組み込まれてるので、常にいつでも利用できます。
つまりは最初に覚える型です。この型を利用してプログラムを構築します。
まずは組み込み型の基礎知識を理解しましょう。残念ながらルールなので暗記です。
値型と参照型の存在
先程登場した値型と参照型の概念が組み込み型にも適用されます。
何がどっちに分類されるのか、しっかり覚えておきましょう。
Default値
C#は型を利用してオブジェクトを生成します。オブジェクト?と思うかもしれませんが、簡単に説明するなら変数です。
これを真面目に話すと長いので簡略化して説明しました。実際には違うので、ここは気をつけてください。
Default値とは名前の通り初期値です。オブジェクトを生成した際に自動的に与えられる値で、これは型ごとに決まってます。
ちなみに値型は殆ど0、参照型は全部nullで何もないを意味します。このnullについては別の機会に話します。
.NET型
組み込み型はC#の言語仕様として備わってる機能です。つまり.NETを利用しなくても使える機能なんです。
しかし、現実的には.NETを使わないC#が存在せず、常に一緒に利用されることから、言語標準または拡張機能のどちら属するのか分かりづらくなってます。
その中でも.NET型と呼ばれる拡張型が存在していて、これから紹介する組み込み型と同じ意味を持つ型が存在します。
より正確に言うと、1つの組み込み型には対になる.NET型が必ず存在し、両者はC#において同一です。
難しい説明になってしまいましたが、組み込み型のint型を例にしましょう。
これの対になる.NET型はSystem.Int32です。これは名前は違うけど両者は全く同じです。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
何で2つあるの?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
C#には全ての型はobject型を継承するって絶対ルールがあって、それを満たすための仕様だと思う(たぶん)。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
継承?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
今は気にしなくていいよ。
値型の組み込み型
bool型
ブール型と呼ばれる値型で、日本語では真偽値と呼ばれます。
trueまたはfalseのどちらかの値しか表現できずDefault値はfalseです。
![bool型](https://takemi.blog/wp-content/uploads/2023/09/C8A14C7B9F2944878716E8BB4A24D9A2_0003.webp)
整数型
整数を表現する値型で、sbyte, byte, short, ushort, int, uint, long, ulong, nint, nuintがあります。
それぞれでサイズと符号有無が異なりDefault値は0です。また、nintとnuintは実行する環境が64bitか32bitでサイズが変わる特殊な型です。
![整数型](https://takemi.blog/wp-content/uploads/2023/09/C8A14C7B9F2944878716E8BB4A24D9A2_0004.webp)
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
はっきり言ってnintとnuintは忘れていいです。
浮動小数点数値型
実数を表現する値型で、float, double, decimalがあります。
それぞれで有効桁数が異なりDefault値は0です。
![浮動小数点数値型](https://takemi.blog/wp-content/uploads/2023/09/C8A14C7B9F2944878716E8BB4A24D9A2_0005.webp)
char型
1文字を表現する値型でDefault値は0です。
深くは触れませんが対応する文字コードはUnicode UTF-16です。
![char型](https://takemi.blog/wp-content/uploads/2023/09/C8A14C7B9F2944878716E8BB4A24D9A2_0006.webp)
参照型の組み込み型
文字列型
0個以上の文字を表現する参照型で別名でstring型と呼びます。参照型なのでDefault値はnullです。
C言語だとchar型の配列が実質的に文字列として扱われるのですが、C#では明確に文字列型として存在します。
また、0個以上に疑問を持った人がいるかもしれませんが、この0文字の文字列を空文字と言います。
Default値のnullとは全くの別物なので、覚えておいてください。
object型
現時点では難しいと思うので名前だけ覚えてください。これは全ての型の基礎になる型で参照型です。
C#に存在する全ての型はobject型を継承していて、故に全ての型はobject型に戻すことができます。
POINT全ての型はobject型を継承している。
dynamic型
動的型付けと呼ばれる参照型です。これも現時点では名前だけの理解でいいです。
これは実行時に型が決定される特殊な型となり、結論を言うと初心者向けではありません。
高度な記述ができるので便利ですが、自分が操作してる型を理解してない人が使うと崩壊します。
void型 (例外)
これは厳密には組み込み型ではありません。関数などで、何もないを意味する特別な表現です。
関数の場所で改めて説明するので現時点では名前のみ覚えてください。
カスタム型(Custom type)
その名の通りカスタマイズできる型です。言ってしまえば新しい型を創造できます。
このカスタム型ですが、内部的には組み込み型やカスタム型の集合に機能を足したもので、自分で作ることもできれば予め用意されてる型もあります。
用意されてる型に関しては.NETの機能として提供され、Microsoft様が作った数多くの機能を簡単に利用できます。
例えばプログラミングで利用するリスト型やOSのファイルを操作する機能など、本当に無限にあります。たぶん、全てを理解してる人はいないでしょう。
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
この.NETを利用できるのがC#の強みで、自分がやりたいと思ったことは99%くらい存在してるんだよね。
![](https://takemi.blog/wp-content/uploads/2024/03/D46ED1C42500466BB89D4AD9CC80048F.webp)
作るよりも使うほうが大切ってことですか?
![](https://takemi.blog/wp-content/uploads/2023/09/00D90ECEDDFA45078397DE4A2A2F7549.webp)
色んな思想があるから一概に言えないけど、現代のプログラミングはパズルの組み合わせだよ。趣味は別として仕事で使える時間は有限なんだ。この限られた時間で作るには、自分で作るべき機能と用意された機能を使うことの双方の視点で考えることが大切だよ。
あとがき
型の理解はC#で非常に大切です。ここまで伝えるのには理由があって、最初の方でC#は型に厳密と言いましたよね。
どのくらい厳密かと言うと、間違えるとビルドが全く通りません。そう、実行すらできないんです。
◆ C#に関する学習コンテンツ
この記事は参考になりましたか?
コメント