+7

[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 !

image.png

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:image.png

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": image.png

Với "out": image.png

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ể: image.png

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

Đã update phần 2


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí