CodeGym /Các khóa học /C# SELF /Tạo object bằng toán tử new

Tạo object bằng toán tử new

C# SELF
Mức độ , Bài học
Có sẵn

1. Làm sao tạo object đúng cách

Toán tử new trong C# giống như nút thần kỳ biến cái "bản vẽ" (class của mình) thành một instance thật (object) mà bạn có thể thao tác. Nói dễ hiểu: class định nghĩa cái gì object có thể làm và thuộc tính của nó, còn newtạo ra object đó trong bộ nhớ máy tính.

Nếu không có toán tử new, class của bạn chỉ như bản vẽ mà không có nhà thật: nhìn thì vui, bàn luận thì được, chứ không thể nhảy nhót hay làm đổ trà lên ghế alcantara đâu nhé.

Nếu class là công thức pizza, thì toán tử new là đầu bếp, người sẽ làm ra chiếc pizza thật dựa trên công thức đó. Object chính là kết quả: pizza trong hộp, sẵn sàng để ăn luôn.

Cú pháp

Xem thử cách dùng new quyền năng này nhé. Đây là cú pháp cơ bản nếu bạn có class Contact:

Contact cont = new Contact();
Tạo object bằng new
  • Contact bên trái — là kiểu biến bạn đang tạo.
  • cont — tên biến (nên đặt tên có ý nghĩa, không thì debug sau này khổ lắm đó).
  • new Contact() — gọi toán tử new, tạo object kiểu Contact.

Trong bộ nhớ

Khi chạy đoạn code này, hệ điều hành sẽ dành một phần bộ nhớ cho object mới, và trả về một reference (địa chỉ) nơi object "sống". Reference này được lưu trong biến cont.

Sơ đồ

+------------------+             +--------------------+
|  biến cont       | --------->  |   Object Contact   |
+------------------+             +--------------------+
          |
          |       (chứa tên, điện thoại, email, ...)
          |
         địa chỉ

2. Tạo object contact

Ở ví dụ trước mình nghĩ ra class như này:

public class Contact
{
    public string Name;
    public string Phone;
    public string Email;
}

Giờ tạo object mới kiểu Contact nhé:


Contact friend = new Contact();
friend.Name = "Ivan Ivanov";
friend.Phone = "+1-999-123-45-67";
friend.Email = "ivan@example.com";

Console.WriteLine($"Tên: {friend.Name}, Điện thoại: {friend.Phone}, Email: {friend.Email}");

Ở đây có gì:

  1. Tạo object bằng new Contact().
  2. Gán giá trị cho các field của nó.
  3. In dữ liệu ra màn hình.

Ví dụ 2:

Thêm nhiều contact hơn — tạo thêm một object nữa:

Contact boss = new Contact();
boss.Name = "Anastasiya Sergeevna";
boss.Phone = "+1-888-765-43-21";
boss.Email = "nastya@company.com";

Console.WriteLine($"Sếp: {boss.Name}, Điện thoại: {boss.Phone}");

Có giống điền form cho từng người quen không? Đúng vậy, object hoạt động như thế: mỗi instance được tạo ra sẽ có giá trị riêng biệt, lưu trữ tách biệt với các object khác!

3. Dùng mảng object

Nếu bạn cần lưu không chỉ một hay hai, mà ví dụ mười contact, thì hợp lý nhất là dùng mảng:


Contact[] contacts = new Contact[3];           // mảng cho 3 object

contacts[0] = new Contact();
contacts[0].Name = "Denis";
contacts[0].Phone = "+7-911-111-22-33";

contacts[1] = new Contact();
contacts[1].Name = "Maria";
contacts[1].Phone = "+7-915-123-45-67";

contacts[2] = new Contact();
contacts[2].Name = "Petr";
contacts[2].Phone = "+7-921-543-21-00";

// In tất cả ra màn hình
for (int i = 0; i < contacts.Length; i++)
{
    Console.WriteLine($"Contact {i+1}: {contacts[i].Name}, {contacts[i].Phone}");
}

Lưu ý: bạn phải dùng new cho từng phần tử của mảng! Tạo mảng không tự tạo object, nó chỉ chuẩn bị chỗ cho reference thôi.

4. Toán tử new và giá trị mặc định

Đôi khi có câu hỏi — nếu chỉ khai báo biến kiểu Contact mà không gán object bằng new, thì sao nhỉ?


Contact someContact;
someContact.Name = "Lỗi";    // Lỗi biên dịch!

Nếu bạn viết:

Contact someContact = null;

thì khi truy cập someContact.Name chương trình sẽ "toang" với exception nổi tiếng:

System.NullReferenceException: Tham chiếu object không trỏ tới instance nào.

Để tránh chuyện này, luôn luôn khởi tạo object bằng new trước khi dùng.

5. Gọi constructor

Khi bạn viết new Contact(), lúc đó sẽ gọi một method đặc biệt — constructor. Hiện tại class của mình chưa có constructor tự định nghĩa, nên sẽ gọi constructor mặc định, tạo object và gán các field giá trị mặc định (null cho reference type, số 0 cho kiểu số).

Ở bài sau bạn sẽ biết cách tự tạo constructor — ví dụ truyền tên và số điện thoại luôn. Hiện tại chỉ có constructor không tham số thôi.

Ví dụ thực tế

Làm việc với object qua toán tử new là chuyện hằng ngày của dev C#. Hãy tưởng tượng bạn:

  • Tạo user trên web — trong code sẽ có object User mới.
  • Mở đơn hàng trên shop online — sẽ có object Order mới.
  • Lưu thông tin sách — object Book mới.

Trong bất kỳ chương trình C# hiện đại nào, bạn sẽ gặp hàng ngàn dòng code với toán tử new.

Bộ nhớ trước khi tạo object


            Contact firstContact; // Biến, nhưng chưa trỏ đi đâu cả
+--------------------------+
|   firstContact           |---->  null (không có gì!)
+--------------------------+

Sau khi tạo object


Contact firstContact = new Contact();
+--------------------------+                 +----------------------+
|   firstContact           |---------------->|   Object Contact     |
+--------------------------+                 +----------------------+

6. Ví dụ thực hành

Giả sử bạn muốn cho user tạo contact mới bằng cách nhập từ bàn phím:


Console.WriteLine("Nhập tên:");
string name = Console.ReadLine();

Console.WriteLine("Nhập điện thoại:");
string phone = Console.ReadLine();

Contact newContact = new Contact();
newContact.Name = name;
newContact.Phone = phone;

Console.WriteLine($"Đã lưu contact: {newContact.Name}, {newContact.Phone}");

Giờ mỗi lần user nhập sẽ tạo ra một object riêng biệt trong bộ nhớ, bạn có thể lưu, sửa, in — làm gì cũng được!

7. Lỗi phổ biến và những cú lừa hài hước

Lỗi số 1: quên gọi new trước khi thao tác với object.
Nếu chỉ khai báo biến mà không khởi tạo, bạn sẽ bị lỗi biên dịch hoặc NullReferenceException khi chạy. Kinh điển luôn: đã khai báo object — tạo nó bằng new ngay nếu thực sự cần dùng.

Lỗi số 2: tạo mảng object nhưng chưa tạo object bên trong.
Đây là bẫy kinh điển: bạn tạo mảng kiểu Contact[], nhưng bên trong chỉ toàn null. Thử truy cập contacts[0].Name là toang liền. Nhớ phải khởi tạo từng phần tử riêng: contacts[i] = new Contact();.

Lỗi số 3: nhầm method với property.
Đôi khi newbie nghĩ method dùng như field: viết student.GetName thay vì student.GetName(). Nếu không dùng kết quả ngay thì không sao — nhưng compiler sẽ báo lỗi nếu bạn dùng "method" ở chỗ cần giá trị. Luôn nhớ: method phải gọi với dấu ngoặc tròn, dù không có tham số.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION