Tìm hiểu cơ chế truyền tham trị và tham chiếu trong C#

Tổng quan về các kiểu dữ liệu trong C#

C# là ngôn ngữ lập trình hướng đối tượng hoàn toàn. Ngôn ngữ này phân chia các kiểu dữ liệu thành hai loại cơ bản, cả hai đều kế thừa từ Object và có cơ chế hoạt động tương tự như các đối tượng class trong C++. Khi thực hiện chuyển đổi giữa hai kiểu dữ liệu này, C# sẽ thực hiện các thao tác boxing và unboxing.

Các kiểu giá trị (Value Types)

  • Các kiểu số (int, float, double, decimal...)
  • Kiểu bool
  • Kiểu liệt kê (enum)
  • Cấu trúc (struct)
  • Kiểu nullable

Các kiểu tham chiếu (Reference Types)

  • Mảng (Array)
  • Lớp (Class)
  • Giao diện (Interface)
  • Đối tượng (object)
  • Chuỗi (string)

Truyền tham trị (Pass by Value)

Khi sử dụng truyền tham trị, phương thức sẽ tạo ra một bản sao mới của tham số để thao tác. Mọi thay đổi bên trong phương thức sẽ không ảnh hưởng đến giá trị gốc của tham số.

using UnityEngine;

public class ValueParameterDemo : MonoBehaviour
{
    private int value = 10;

    void Start()
    {
        Increment(value);
        value--;
        Debug.Log("Gia tri hien tai: " + value);
    }

    void Increment(int number)
    {
        number++;
        Debug.Log("Gia tri trong ham: " + number);
    }
}

Kết quả thực thi:

Truyền tham chiếu (Pass by Reference)

Với truyền tham chiếu, phương thức nhận được địa chỉ của đối tượng gốc chứ không phải bản sao giá trị. Điều này có nghĩa là mọi thay đổi trong phương thức sẽ ảnh hưởng trực tiếp đến đối tượng ban đầu. Cơ chế này tương tự như con trỏ trong C++.

using System;

namespace CSharpDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = new int[] { 1, 2, 3, 4, 5 };
            string message = "xin chao";

            ModifyData(numbers, message);

            Console.WriteLine("Mang sau khi thay doi:");
            for (int i = 0; i < numbers.Length; i++)
            {
                Console.WriteLine("numbers[" + i + "]: " + numbers[i]);
            }

            Console.WriteLine("Chuoi: " + message);
            Console.ReadKey();
        }

        static void ModifyData(int[] arr, string str)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] *= 10;
                Console.WriteLine("Gia tri trong ham: " + arr[i]);
            }

            str = "tam biet";
            Console.WriteLine("Chuoi trong ham: " + str);
        }
    }
}

Kết quả xuất ra:

So sánh sự khác biệt

Tiêu chí Truyền tham trị Truyền tham chiếu
Cơ chế Sao chép giá trị thực tế Truyền địa chỉ bộ nhớ
Thay đổi Không ảnh hưởng đến gốc Ảnh hưởng trực tiếp đến gốc
Bộ nhớ Tạo bản sao mới Dùng chung vùng nhớ

Khi sử dụng truyền tham trị, hệ thống sẽ cấp phát bộ nhớ cho tham số hình thức và sao chép giá trị của tham số thực tế vào đó. Mọi thay đổi đối với tham số hình thức sẽ không ảnh hưởng đến tham số thực tế ban đầu.

Ngược lại, với truyền tham chiếu, hệ thống truyền địa chỉ của tham số thực tế cho tham số hình thức. Do đó, tham số hình thức trỏ đến cùng vùng nhớ với tham số thực tế, và mọi thay đổi bên trong phương thức sẽ tác động trực tiếp lên đối tượng gốc.

Thẻ: C# parameter-passing value-types reference-types .NET

Đăng vào ngày 26 tháng 6 lúc 23:01