stringは実はクラスです 〜スイカは野菜だった?〜
C#を学び始めたとき、多くの人がこう思います。
int number = 10;
float value = 3.14f;
string name = "山田";
この3つは同じ「型」に見えますよね。
でも実は、
stringだけは立ち位置が違います。
今日はそれを、スイカの例えで説明します。
🍉 スイカは野菜?果物?
スイカはどう思いますか?
- 食べ方は果物
- でも農業分類では野菜(果実的野菜)
でしたよね。
つまり
見た目は果物だけど、分類上は野菜
これと同じことが
C#の string にも起きています。
int と float は「値型」
まずはこの2つ。
int age = 20;
float height = 170.5f;
これらは 値型(Value Type) です。
特徴:
- 変数の中に値そのものが入る
- 軽量
- メモリ上に直接格納される
いわば、
シンプルな数値専用の型
です。
string は見た目は似ている
string name = "山田";
書き方は int と似ています。
だから多くの人がこう思います。
stringも数値と同じ仲間かな?
でも違います。
string はクラスです
実は string は
System.String
という クラス です。
つまり
- 参照型(Reference Type)
- オブジェクト
- 中身はかなり複雑な仕組み
なんです。
例えるなら
| 型 | 例え |
|---|---|
| int | 単純な数字ボックス |
| float | 小数ボックス |
| string | 高機能な文字列マシン |
stringは単なる箱ではなく、
- 長さを数えられる
- 文字を切り出せる
- 結合できる
- 置換できる
など、多くの機能を持っています。
だからクラスなんです。
スイカとの比較
| 食べ物 | C# |
|---|---|
| スイカは見た目は果物 | stringは見た目は基本型 |
| 分類上は野菜 | 実はクラス |
| ちょっと意外 | ちょっと意外 |
なぜ区別が大事?
今はまだ
string name = "山田";
としか使っていないかもしれません。
でも後で学ぶ
- クラス
- インスタンス
- 参照
- null
- ヒープメモリ
などを理解するとき、
「stringはクラスだった」
という知識が効いてきます。
まとめ
- int と float は値型
- string は参照型(クラス)
- 見た目に騙されないことが大事
スイカが野菜だったように、
stringは実はクラスです。
スイカは野菜、stringはクラス。
上記で、
string はクラスです
と説明しました。
すると、鋭い人がこう思います。
クラスなら new が必要じゃないですか?
たしかに。
Player p = new Player();
クラスは普通こう書きますよね。
でも string は…
string name = "山田";
new していません。
なぜでしょう?
実はこう書いているのと同じ
このコード:
string name = "山田";
実は内部的には、ほぼこれと同じ意味です。
string name = new string("山田");
つまり、
ちゃんと new されています。
ただし――
コンパイラが自動でやってくれている のです。
文字列リテラルという特別扱い
"山田"
この書き方を 文字列リテラル と言います。
C#では、文字列リテラルは特別で、
- コンパイル時に生成される
- 文字列プールという場所に保存される
- 同じ文字列は共有される
という仕組みがあります。
つまりどういうこと?
string a = "山田";
string b = "山田";
このとき、
実はメモリ上では
同じ「山田」を共有しています。
無駄に new を何回もしていないのです。
賢いですね。
では new してはいけないの?
こう書くこともできます。
string name = new string("山田".ToCharArray());
でも普通は書きません。
理由:
- 無駄にインスタンスを作る
- メモリ効率が悪くなる
- 読みにくい
だから普段はリテラルを使います。
まとめ
| 疑問 | 答え |
|---|---|
| string はクラス? | はい |
| じゃあ new は? | コンパイラがやっている |
| なぜ書かなくていい? | 文字列リテラルが特別扱いだから |
授業で使える一言
string はクラス。
でも特別扱いされているクラス。
ひでぽんさんのクラス段階なら、
ここでは
- 「ヒープ」
- 「文字列プールの詳細」
までは触れなくて大丈夫です。
あくまで
「クラスだけど、特別枠」
くらいがちょうど良いです。



ディスカッション
コメント一覧
まだ、コメントがありません