Trang chủ » Blog » Truyền tham trị và truyền tham chiếu trong C#

Truyền tham trị và truyền tham chiếu trong C#

bởi CodeGym | 26/12/2023 15:36 | Blog

Bài viết này sẽ giúp bạn hiểu về truyền tham trị và truyền tham chiếu trong C#.

Truyền tham trị là gì? Tìm hiểu về truyền tham trị

Tham trị có nghĩa là truyền giá trị của biến. Mọi xử lí tính toán trong phương thức khi kết thúc thì không làm thay đổi giá trị của biến tham số truyền vào

Các đối số được truyền bằng giá trị cho các tham số khi phương thức được gọi

Sức mạnh của một phương thức là khả năng làm việc với các tham số. Bạn có thể sử dụng WriteLine để in bất kỳ chuỗi nào. Khi gọi một phương thức, bạn cần phải cung cấp các đối số, nó phải được cung cấp theo thứ tự như các tham số tương ứng trong method signature. Đây được gọi là sự kết hợp các tham số (parameter order association). Ví dụ, phương thức sau in một thông báo n lần:

public static void Println(String message, int n) {
   for (int i = 0; i < n; i++)
      Console.WriteLine(message);
}

Bạn có thể sử dụng Println(“Hello”, 3) để in chuỗi Hello 3 lần. Lệnh Println(“Hello”, 3) truyền giá trị trong tham số chuỗi thực là Hello tới tham số message, truyền 3 cho n và in ra Hello 3 lần. Tuy nhiên, lệnh Println(3, “Hello”)  bị sai. Kiểu dữ liệu của 3 không khớp với kiểu dữ liệu của tham số đầu tiền là một chuỗi (message), Hello không khớp với tham số thứ 2 là một số nguyên (n)

Lưu ý:

Các đối số phải khớp với các tham số theo thứ tự, số và kiểu tương thích, như đã định nghĩa trong method signature. Kiểu tương thích có nghĩa là bạn có thể truyền một đối số cho một tham số mà không ép kiểu tường minh, chẳng hạn như truyền một đối số giá trị int tới một tham số giá trị số thực (double)

Khi bạn gọi một phương thức với một đối số, giá trị của đối số được truyền tới tham số. Đây được gọi là truyền tham trị (pass-by-value). Nếu đối số là một biến thay vì một hằng giá trị, giá trị của biến được truyền tới tham số. Biến không bị ảnh hưởng, bất kể những thay đổi được thực hiện cho tham số bên trong phương thức. Quan sát đoạn mã sau đây, giá trị của x được truyền cho tham số n để gọi phương thức Increment. Tham số n được tăng lên 1 trong phương thức Increment, nhưng x không bị thay đổi.

public static void Main(string[] args)
{
     int x = 1;
     Console.WriteLine("Before the call, x is " + x);
     Increment(x);
}

public static void Increment(int n)
{
     n++;
     Console.WriteLine("n inside the method is " + n);
}

Đoạn mã  sau đây đưa ra một chương trình khác chứng tỏ sự ảnh hưởng của việc truyền bằng giá trị. Chương trình tạo ra một phương thức để đổi chỗ giá trị của hai biến. Phương thức Swap được gọi bằng cách truyền cho nó 2 đối số. Thật thú vị, các giá trị của các đối số không bị thay đổi sau khi phương thức được gọi.

public static void Main(string[] args)
{
     int num1 = 1;
     int num2 = 2;

     Console.WriteLine("Before invoking the swap method, num1 is " + num1 + " and num2 is " + num2);
     // Invoke the swap method to attempt to swap two variable
     Swap(num1, num2);

     Console.WriteLine("Affter invoking the swap method, num1 is " + num1+" and num2 is "+num2);
}

public static void Swap(int n1, int n2)
{

     Console.WriteLine("\t Inside the swap method");
     Console.WriteLine("\t\tBefore swapping, n1 is " + n1 + " and n2 is" + n2);

     int temp = n1;
     n1 = n2;
     n2 = temp;

     Console.WriteLine("\t\tAfter swapping, n1 is " + n1 + " and n2 is " + n2);
     Console.ReadLine();
}

Trước khi phương thức Swap được gọi , num1 là 1 và num2 là 2. Sau khi phương thức Swap được gọi, num1 vẫn là 1 và num2 vẫn là 2. Các giá trị của chúng chưa được hoán đổi. Các giá trị của các đối số num1 và num2 được truyền đến n1 và n2, nhưng n1 và n2 có vị trí bộ nhớ riêng của chúng không phụ thuộc num1 và num2. Vì vậy, thay đổi n1 và n2 không ảnh hưởng đến nội dung của num1 và num2.

Một giả thiết khác là thay đổi tên tham số n1 trong Swap thành num1. Điều này có ảnh hưởng không? Không có sự thay đổi nào xảy ra, bởi vì nó không tạo ra sự khác biệt dù tham số theo giả thiết là cùng tên. Tham số là một biến trong phương thức với không gian bộ nhớ riêng. Biến được cấp phát khi phương thức được gọi và nó biến mất khi phương thức trả về nơi gọi nó.

Truyền tham chiếu là gì? Tìm hiểu về truyền tham chiếu

Tham chiếu có nghĩa là truyền trực tiếp địa chỉ ô nhớ của biến. Chính vì thế mà mọi tính toán trong phương thức sẽ làm thay đổi giá trị của biến tham số truyền vào khi phương thức kết thúc

Truyền tham chiếu chúng ta sử dụng từ khóa ref hoặc out

  • Khi dùng ref biến phải được khởi tạo trước rồi mới truyền cho phương thức
  • Khi dùng out biến không cần khởi tạo trước khi truyền vào phương thức. Nhưng bên trong phương thức bắt buộc phải gán giá trị cho biến
  • Khi gọi và khi khai báo phương thức đều bắt buộc phải có kèm theo ref hoặc out trước tên biến muốn truyền.

Quan sát đoạn mã sau:

public class Program
 {
     public static void Main(string[] args)
     {
         int a = 1;
         int b = 2;
         Console.WriteLine("Trước khi thay đổi");
         Console.WriteLine("a = {0}, b = {1}", a, b);
         Swap(ref a, ref b);
         Console.WriteLine("Sau khi thay đổi");
         Console.WriteLine("a = {0}, b = {1}", a, b);

         int x;
         GetValue(out x);

         Console.WriteLine(x);

      }

     public static void Swap(ref int a, ref int b)
     {
         int tmp;
         tmp = a;
         a = b;
         b = tmp;
     }

     public static void GetValue(out int x)
     {
        x = 5;
     }

}

Trước khi phương thức Swap được gọi , a là 1 và b là 2. Sau khi phương thức Swap được gọi, a là 2 và b là 1. Các giá trị của chúng được hoán đổi.

ĐỌC THÊM CÁC TÀI LIỆU, HƯỚNG DẪN HỌC LẬP TRÌNH C# KHÁC TẠI ĐÂY.

Tags:

0 Lời bình

Gửi Lời bình

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

BÀI VIẾT LIÊN QUAN

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

098 953 44 58

Đăng ký tư vấn lộ trình học lập trình

Đăng ký tư vấn, định hướng lộ trình học và giải đáp các thắc mắc về ngành nghề – Miễn phí – Online.

5 + 3 =

TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM
TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM