So Sánh null Và Rỗng

tải xuống 16 2

Contents

null và rỗng?

Xét ví dụ một tham chiếu kiểu string trong ngôn ngữ C#, ta có 2 lựa chọn như sau

  1. string str_a = null; // null
  2. string str_b = “”; // rỗng

Dòng code đầu tiên biểu thị của việc không có đối tượng kiểu string tồn tại trong bộ nhớ – KHÔNG TỒN TẠI. Dòng code thứ hai biểu thị có tồn tại đối tượng string trong bộ nhớ và dữ liệu của đối tượng này đang có là một chuỗi không chứa ký tự nào cả – TỒN TẠI CÁI KHÔNG CÓ GÌ.

Điều khác biệt thứ 2 của 2 dòng codes trên là str_a chứa một thông tin để ta có thể kiểm tra được là đối tượng str_a chưa tồn tại, còn str_b thì đã tồn tại rồi. Nếu ta xem các dòng code trên là SỰ KHỞI ĐẦU của một biến thì dường như str_b là một sự thiên vị khi ta hy sinh 1 giá trị (rỗng) để đánh dấu cho sự khởi đầu của str_b, trong khi đó chính ngôn ngữ lập trình đã thiết kế sẵn cho ta null để đánh dấu như một trường hợp đặc biệt.

null hay rỗng khi thực thi thất bại?

Đặt trường hợp ta có một hàm thực thi một nhiệm vụ và sẽ trả về một đối tượng. Vậy đối tượng trả về sẽ là KHÔNG CÓ ĐỐI TƯỢNG NÀO hay là có một đối tượng với tất cả thuộc tính mặc định (0-1 hoặc “”) do ta tự quy ước?

Có một quan điểm cho rằng, nếu hàm trả về null thì xác suất gây ra lỗi thực thi cao hơn trả về một giá trị mặc định, thường là rỗng. Xem xét codes bên dưới mà quan điểm này đề cập

  1. StdioDevice3D device = CreateGraphicDevice();
  2.  
  3. device.PerformDraw();

Nếu CreateGraphicDevice() khởi tạo thất bại sẽ trả về null, nếu device là null thì không có đối tượng tồn tại và gây ra lỗi (crash) khi gọi PerformDraw(). Với cá nhân tôi thì quan điểm này không thuyết phục vì nếu là người có kinh nghiệm, ta sẽ kiểm tra rất chặt chẽ ứng dụng

  1. StdioDevice3D device = CreateGraphicDevice();
  2.  
  3. if (device != null)
  4. {
  5. device.performDraw();
  6. }

NULL và nullptr trong C++11

Trong C++03 trở về trước, giá trị 0 (NULL) được sử dụng để đánh dấu cho 1 pointer chưa trỏ đến đâu. Bản thân hệ thống sẽ không cấp phát tại vùng nhớ có địa chỉ 0. Chúng ta không xét ở khía cạnh của mã máy, chỉ tập trung xét ở khía cạnh của ngôn ngữ C++ thì đến phiên bản C++11 mới cho ra đời khái niệm nullptr chuyên đánh dấu cho khái niệm chưa tồn tại của vùng nhớ.

 

Trả lời