1. オブジェクトの正しい作り方
C#のnew演算子は、まるで魔法のボタンみたいなもので、設計図(クラス)を本物のインスタンス(オブジェクト)に変えてくれるんだ。簡単に言うと、クラスは何ができるかとかプロパティを決めてて、newはそのオブジェクトをPCのメモリに作るって感じ。
new演算子がなかったら、クラスはただの設計図でしかないよ。見て楽しむだけで、ジャンプしたり、アルカンタラの椅子にお茶をこぼしたりはできない(笑)。
クラスがピザのレシピなら、new演算子はそのレシピ通りにピザを作るシェフ。オブジェクトはその成果物、つまり箱に入ったピザで、もう食べられるやつ!
シンタックス
じゃあ、この万能なnewをどう使うか見てみよう。例えばクラスContactがあるとするね:
Contact cont = new Contact();
- 左のContactは、作る変数の型。
- contは変数名(分かりやすい名前にしないと、後でデバッグで泣くよ)。
- new Contact()はnew演算子の呼び出しで、Contact型のオブジェクトを作る。
メモリの中身
このコードが実行されると、OSが新しいオブジェクト用のメモリ領域を確保して、その「住所」(アドレス)を返してくれる。そのアドレスがcont変数に入るんだ。
イメージ図
+------------------+ +--------------------+
| 変数 cont | ---------> | Contactオブジェクト |
+------------------+ +--------------------+
|
| (名前、電話、emailなどが入ってる)
|
アドレス
2. Contactオブジェクトを作ってみよう
前の例で、こんなクラスを考えたよ:
public class Contact
{
public string Name;
public string Phone;
public string Email;
}
じゃあ、Contact型の新しいオブジェクトを作ってみよう:
Contact friend = new Contact();
friend.Name = "イワン イワノフ";
friend.Phone = "+1-999-123-45-67";
friend.Email = "ivan@example.com";
Console.WriteLine($"名前: {friend.Name}, 電話: {friend.Phone}, Email: {friend.Email}");
ここで何が起きてるか:
- new Contact()でオブジェクトを作る。
- フィールドに値をセットする。
- データを画面に表示する。
例2:
今度は複数のContactを使ってみよう。もう一つオブジェクトを作るよ:
Contact boss = new Contact();
boss.Name = "アナスタシア セルゲエヴナ";
boss.Phone = "+1-888-765-43-21";
boss.Email = "nastya@company.com";
Console.WriteLine($"ボス: {boss.Name}, 電話: {boss.Phone}");
まるで知り合いごとにアンケートを書いてるみたいでしょ?オブジェクトってそういうもので、作ったインスタンスごとにユニークな値を持ってて、他と別々に保存されるんだ!
3. オブジェクトの配列を使う
もし1人や2人じゃなくて、例えば10人の連絡先を保存したいなら、配列に入れるのが自然だよね:
Contact[] contacts = new Contact[3]; // 3つのオブジェクト用配列
contacts[0] = new Contact();
contacts[0].Name = "デニス";
contacts[0].Phone = "+7-911-111-22-33";
contacts[1] = new Contact();
contacts[1].Name = "マリア";
contacts[1].Phone = "+7-915-123-45-67";
contacts[2] = new Contact();
contacts[2].Name = "ペトル";
contacts[2].Phone = "+7-921-543-21-00";
// 全員表示してみよう
for (int i = 0; i < contacts.Length; i++)
{
Console.WriteLine($"連絡先 {i+1}: {contacts[i].Name}, {contacts[i].Phone}");
}
重要:配列の各要素ごとにnewを使ってるよ!配列を作るだけじゃ中身のオブジェクトは作られない。ただ参照用の場所ができるだけ。
4. new演算子とデフォルト値
たまに「Contact型の変数を宣言しただけで、newでオブジェクトをセットしなかったらどうなるの?」って質問があるよ。
Contact someContact;
someContact.Name = "エラー"; // コンパイルエラー!
もしこう書いたら:
Contact someContact = null;
そのままsomeContact.Nameにアクセスしようとすると、プログラムは有名な例外で落ちるよ:
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
こうならないように、使う前に必ずnewでオブジェクトを初期化しよう。
5. コンストラクタの呼び出し
new Contact()って書くと、その瞬間に特別なメソッド、コンストラクタが呼ばれるよ。今のクラスには明示的なコンストラクタはないから、デフォルト(暗黙)のコンストラクタが呼ばれて、オブジェクトが作られて、フィールドは全部デフォルト値(参照型はnull、数値型は0)になる。
次のレクチャーでは、自分でコンストラクタを作る方法をやるよ。例えば名前や電話番号を最初から渡せるようにしたりね。今はパラメータなしのコンストラクタだけ使える状態。
リアルな例
new演算子でオブジェクトを作るのは、C#エンジニアの日常だよ。例えば:
- サイトでユーザーを作ると、コードに新しいUserオブジェクトができる。
- ネットショップで注文を開くと、新しいOrderができる。
- 本のデータを登録すると、新しいBookオブジェクトができる。
どんなC#プログラムでも、new演算子が何千回も出てくるよ。
オブジェクト作成前のメモリ
Contact firstContact; // 変数だけど、何も指してない
+--------------------------+
| firstContact |----> null (なにもない!)
+--------------------------+
オブジェクト作成後
Contact firstContact = new Contact();
+--------------------------+ +----------------------+
| firstContact |---------------->| Contactオブジェクト |
+--------------------------+ +----------------------+
6. 実践例
例えば、ユーザーがキーボードから新しい連絡先を作れるようにしたいとするよ:
Console.WriteLine("名前を入力してください:");
string name = Console.ReadLine();
Console.WriteLine("電話番号を入力してください:");
string phone = Console.ReadLine();
Contact newContact = new Contact();
newContact.Name = name;
newContact.Phone = phone;
Console.WriteLine($"保存した連絡先: {newContact.Name}, {newContact.Phone}");
これで、ユーザーが入力するたびにユニークなオブジェクトがメモリにできて、保存したり、変更したり、表示したり、なんでもできる!
7. よくあるミスと面白い落とし穴
ミス1:newを呼ばずにオブジェクトを使おうとした。
変数を宣言しただけで初期化しないと、コンパイルエラーか、実行時にNullReferenceExceptionが出るよ。これ、超あるある。オブジェクトを宣言したら、必要ならすぐnewで作ろう。
ミス2:オブジェクトの配列を作ったけど、中身のオブジェクトを作ってない。
これもよくある罠。Contact[]型の配列を作っても、中身はnullの集まり。contacts[0].Nameにアクセスしようとすると落ちる。まずは各要素をcontacts[i] = new Contact();で初期化しよう。
ミス3:メソッドとプロパティを間違えた。
初心者は、メソッドをフィールドみたいに使っちゃうことがある。student.GetNameって書いちゃって、student.GetName()じゃない。すぐに値を使わなければ動くけど、値が必要なところで「メソッド」を渡すとコンパイラが怒る。メソッドは必ずカッコ付きで呼ぼう。パラメータがなくてもね。
GO TO FULL VERSION