Trong bài viết này chúng ta sẽ cùng đi tìm hiểu khái niệm tham trị, tham chiếu cùng với từ khóa ref và out trong C#. Khái niệm tham trị, tham chiếu cũng là một khái niệm mà bất cứ lập trình viên nào cũng nên nắm bắt, vì đây cũng là một khái niệm không quá mới
Tham trị là gì ?
Ở bài học về hàm trong C#, mình đã trình bày cho các bạn về khái niệm tham số. Mình giải thích tóm gọn lại như sau: “Tham số được khai báo trong ô danh sách tham số trong cấu trúc của hàm nhằm giúp chương trình xác định được hàm đó cần bao nhiêu tham số truyền vào mỗi tham số phải sử dụng kiểu dữ liệu gì”.
Nhưng khác với tham số, tham trị là các giá trị được truyền vào thay thế lại các giá trị tham số khi gọi hàm.
Giả sử chúng ta có một đoạn mã giả:
int calc(int a, int b) { return a + b; }
Thì khi chúng ta gọi hàm trên như sau:
calc(1, 2);
Lúc này, giá trị 1 và 2 mình truyền vào khi gọi hàm ở trên được gọi là tham trị. Ngoài ra, khái niệm tham trị không chỉ đúng với các giá trị hằng, mà còn đúng với các giá trị biến. Giả sử khi chúng ta khai báo 2 biến số để truyền vào hàm calc
ở trên:
int a = 10; int b = 100; calc(a, b);
Lúc này biến a
và biến b
cũng được gọi là các tham trị.
Tham chiếu là gì ?
Tham chiếu giống như là tập cha của 2 thằng tham trị, tham biến. Khi mà tham chiếu biến chính là tham biến còn tham trị chính là tham chiếu giá trị. Chúng ta có khái niệm tham chiếu là một giá trị tham số của hàm cho phép chương trình truy xuất gián tiếp tới một hoặc nhiều số liệu cụ thể bằng cách sử dụng tham biến truyền vào trong hàm.
Như đã nói ở trên, tham chiếu chỉ giúp chúng ta truy xuất gián tiếp tới một hoặc nhiều số liệu cụ thể…Việc truy xuất một cách gián tiếp thực chất chương trình đã tạo ra một bản copy của tham biến truyền vào và được sử dụng ngăn cách hoàn toàn với tham biến ban đầu. Vậy nếu chúng ta muốn truy xuất một cách trực tiếp thì sao ? Vì vậy, từ khóa ref
và out
ra đời.
Từ khóa ref và out trong C#
Từ khóa ref và out là 2 từ khóa giúp chúng ta có thể sử dụng tham chiếu để truy xuất một cách trực tiếp tới một hoặc nhiều số liệu cụ thể đã nói ở trên.
Cú pháp sử dụng của ref và out là tương tự nhau, khi khai báo tham số cho hàm chúng ta sử dụng với cấu trúc:
[ref hoặc out] <kiểu dữ liệu> <tên biến>;
Khi khai báo ref và out cho tham số, khi chúng ta sử dụng tham biến, chúng ta cũng phải sử dụng thêm từ khóa tương ứng với từ khóa đã sử dụng ở tham số.
[ref hoặc out] <tên biến>;
Cơ bản, chức năng của 2 từ khóa này là giống nhau, điều đó được chứng minh qua ví dụ:
Chương trình sử dụng ref:
using System.IO; using System; namespace LTKK { class Program { static void Change_A(ref int A) { A = 10; } static void Main() { int a = 75; Console.WriteLine(a); Change_A(ref a); Console.WriteLine(a); Console.ReadKey(); // dừng màn hình } } }
Chương trình sử dụng out:
using System.IO; using System; namespace LTKK { class Program { static void Change_A(out int A) { A = 10; } static void Main() { int a = 75; Console.WriteLine(a); Change_A(out a); Console.WriteLine(a); Console.ReadKey(); // dừng màn hình } } }
Cả 2 chương trình này đều cho ra kết quả là:
75 10
Trong cả 2 chương trình, mình đã khai báo giá trị biến a
có kiểu số nguyên với giá trị là 75
, ngay sau khi khai báo mình lập tức in ra giá trị của a
kết quả lúc đầu xuất ra 75 là điều dễ hiểu. Nhưng lúc này, ngay sau khi sử dụng hàm Change_A
giá trị của biến a
ban đầu bất ngờ lại bị đổi thành 10
do mình gán trong hàm. Điều này chứng minh rằng chương trình đã truy vấn trực tiếp với tham chiếu A
dẫn tới việc biến a
ban đầu cũng bị thay đổi theo.
Giờ khi chúng ta thay đổi lại chương trình, không sử dụng ref, out nữa chúng ta sẽ thấy khác biệt rõ rệt:
using System.IO; using System; namespace LTKK { class Program { static void Change_A(int A) { A = 10; } static void Main() { int a = 75; Console.WriteLine(a); Change_A(a); Console.WriteLine(a); Console.ReadKey(); // dừng màn hình } } }
Chương trình này cho ra kết quả:
75 75
Biến a
khi không sử dụng ref, out thì không bị thay đổi qua hàm Change_A
.
Một vấn đề khác đặt ra, khi nào thì sử dụng ref, khi nào sử dụng out ?
- Sử dụng ref khi chúng ta cần truy vấn một cách trực tiếp với tham chiếu nhưng biến tham biến phải khởi tạo sẵn giá trị.
- Sử dụng out khi chúng ta cần truy vấn một cách trực tiếp tới tham chiếu nhưng biến tham biến không cần khởi tạo sẵn giá trị.
Tổng kết
Như vậy là trong bài học ngày hôm nay mình đã cùng với các bạn đi tìm hiểu về tham trị, tham chiếu cũng như là từ khóa ref, out trong C#. Ở bài học tiếp theo, chúng ta sẽ đi tìm hiểu về khái niệm của mảng trong C#. Cảm ơn bạn đã đọc bài viết này. Hãy tiếp tục ủng hộ Lập trình không khó trong các bài viết tiêp theo nhé !
(các bạn có thể tìm hiểu thêm tại đây)
Để lại một bình luận