[C#]Tối ưu code với kiểu truyền tham chiếu "ref" và "out" (Phần 1)
I. Bài toán đặt ra
Trong công ty, có một bạn nhân viên có nickname là “Hoang Long” nhưng một ngày bạn muốn thay đổi nickname thành “Hoang Long dep trai”. Yêu cầu viết 1 function để thực hiện.
Cùng so sánh tốc độ thực thi và cách tối ưu bộ nhớ khi giải quyết bài toán này theo 2 cách: truyền parameter bình thường và dùng parameter tham chiếu
II. Dẫn nhập
1. Ôn lại về bộ nhớ head và stack !
Giống
- Cả 2 đều là bộ nhớ được tạo ra trên RAM khi chương trình thực thi
Khác
Điểm so sánh | Stack | Head |
---|---|---|
Lưu trữ biến | Biến cục bộ, tham chiếu truyền vào | Biến con trỏ được cấp phát động (với C# thì là từ khóa new) |
Quản lý bởi | Hệ điều hành | Lập trình viên |
Tốc độ truy cập | Rất nhanh | Bình thường |
Kích thước | Cố định (tùy vào hệ điều hành) | Có thể tang giảm linh động, tùy vào nhu cầu sử dụng |
2. Cách lưu trữ khi truyền Parameter bình thường
VD:
Trong ví dụ trên, “Hoang Long” được truyền vào khi thực hiện function ChangeName sẽ được copy giá trị vào bộ nhớ stack, thực hiện xong gán giá trị ngược lại cho biến newName
Vậy phải có 2 bước:
- Sao chép giá trị vào 1 biến tạm
- Gán ngược lại giá trị cho 1 biến mới
Vì vậy chúng ta thực hiện trên cùng ô nhớ của string name thì tốc độ xử lý sẽ nhanh hơn, vậy làm sao để thực hiện?
III. ref và out
Chúng ta có thể thêm từ khóa ref và out khi khai báo và gọi hàm để chỉ cho máy biết sẽ lấy chính ô nhớ của biến để thực thi:
Với "ref":
Với "out":
Như ví dụ, chúng ta không cần phải gán ngược lại giá trị cho 1 biến nào, mà biến được truyền đã thay đổi giá trị khi thực hiện xong hàm.
→ Do đó, tốc độ xử lý sẽ nhanh hơn do máy không phải thực hiện 2 bước là copy ra biến tạm và gán ngược lại giá trị.
Với DataTable hoặc các data type có dữ liệu lớn thì ra cũng có thể:
Phần sau mình sẽ giới thiệu cách dung ref và out, ngoài ra các bạn có thể tham khảo qua các nguồn mà mình dùng trong bài chia sẻ này:
Sự khác nhau giữa bộ nhớ Heap và bộ nhớ Stack trong lập trình: Tại đây
Truyền tham chiếu với ref và out trong C#: Tại đây
Từ khóa ref và out trong C#: Tại đây
All rights reserved