この章のテーマ §
new演算子と2つの主な使い方を学びます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, string型, 参照型と値型, コンストラクタ
解説 §
new演算子は参照型と値型で機能が異なります。
参照型で使用した場合は、コンストラクタに引数を渡し、メモリを確保して新しいオブジェクトを生成します。つまり、メモリ消費量が増えます。
値型で使用した場合は、コンストラクタに引数を渡してオブジェクトを初期化しますが、それによってメモリを確保することはありません。つまり、使ってもメモリ消費量は増えません。
どちらも、使い方は"new 型名(引数リスト)"ですが、型名のない匿名オブジェクトを確保する場合や、配列を確保する場合など、この通りにならないケースもいろいろあります。
罠の数々 §
- new string('X', 10);は、文字Xが10個並んだ文字列を新たに産み出す
- new DateTime(2029, 1, 1, 8, 30, 0);は、2029年1月1日8時30分0秒で変数を初期化する
- new演算子を使用しないでオブジェクトを作り出すこともある。たとえば、ファクトリーパターンと呼ばれるコーディングのパターンでは、オブジェクトを作り出すメソッド等を作成し、new演算子は直接使用しない
- 2つの文字列型の変数をX+Yのように記述して文字列を連結する場合も、new演算子は無いが新しいオブジェクトが作成されている
参考リンク §
サンプルソース: kw_new §
Console.WriteLine("参照型の場合");
var s = new string('X', 10);
Console.WriteLine($"s={s}");
Console.WriteLine("値型の場合");
var d = new DateTime(2029, 1, 1, 8, 30, 0);
Console.WriteLine($"d={d}");
実行結果 §
参照型の場合
s=XXXXXXXXXX
値型の場合
d=2029/01/01 8:30:00
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
メモリ消費量の多いオブジェクトをnew演算子で生成し続けると何が起こるだろうか。ただし、型は参照型とする。正しい解釈を選ぼう。
- 仮想記憶は実メモリ以上のメモリを確保できるので、どれだけ確保してもオッケー! 単に遅くなるだけ
- 使用可能なメモリが尽きて確実にプログラムは例外で強制終了となる
- 参照を保存していなければ何回newしても、別にメモリ消費量は増えない
- 静的な変数に格納すればメモリが溢れることはない
- システム依存なので、動作するシステムによってメモリ溢れが起きるかどうかは異なる
[[解答]]