CodeGym /コース /C# SELF /new演算子でオブジェクトを作る

new演算子でオブジェクトを作る

C# SELF
レベル 16, レッスン 2
使用可能

1. オブジェクトの正しい作り方

C#のnew演算子は、まるで魔法のボタンみたいなもので、設計図(クラス)を本物のインスタンス(オブジェクト)に変えてくれるんだ。簡単に言うと、クラスは何ができるかとかプロパティを決めてて、newはそのオブジェクトをPCのメモリに作るって感じ。

new演算子がなかったら、クラスはただの設計図でしかないよ。見て楽しむだけで、ジャンプしたり、アルカンタラの椅子にお茶をこぼしたりはできない(笑)。

クラスがピザのレシピなら、new演算子はそのレシピ通りにピザを作るシェフ。オブジェクトはその成果物、つまり箱に入ったピザで、もう食べられるやつ!

シンタックス

じゃあ、この万能なnewをどう使うか見てみよう。例えばクラスContactがあるとするね:

Contact cont = new Contact();
newでオブジェクトを作る
  • 左の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}");

ここで何が起きてるか:

  1. new Contact()でオブジェクトを作る。
  2. フィールドに値をセットする。
  3. データを画面に表示する。

例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()じゃない。すぐに値を使わなければ動くけど、値が必要なところで「メソッド」を渡すとコンパイラが怒る。メソッドは必ずカッコ付きで呼ぼう。パラメータがなくてもね。

2
タスク
C# SELF, レベル 16, レッスン 2
ロック未解除
`new` 演算子を使ったシンプルなクラス
`new` 演算子を使ったシンプルなクラス
2
タスク
C# SELF, レベル 16, レッスン 2
ロック未解除
オブジェクト配列の作成
オブジェクト配列の作成
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION