Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

So sánh Value Type và Reference Type trong C#

Tất cả kiểu trong C# chia thành 2 loại chính: Value Types (kiểu giá trị) và Reference Types (kiểu tham chiếu).

Value Types (Kiểu giá trị)

Biến kiểu giá trị chứa trực tiếp dữ liệu. Mỗi biến có bản sao riêng → không thể biến này sửa đổi object của biến kia.

Kiểu giá trị bao gồm:

  • Tất cả kiểu số: int, float, double
  • char và bool
  • struct
  • enum

Kiểu giá trị chứa trực tiếp giá trị (số thực tế), không phải con trỏ như reference type.

Tạo custom value type bằng struct:


public struct Point { public int X; public int Y; }
var p1 = new Point();

Trong bộ nhớ, instance Point biểu diễn như sau:

So sánh Value Type và Reference Type trong C#

Gán biến kiểu giá trị cho biến khác → tạo bản sao giá trị:


Point p2 = p1;

So sánh Value Type và Reference Type trong C#

Reference Types (Kiểu tham chiếu)

Biến kiểu tham chiếu lưu tham chiếu (reference) đến object. Có thể 2 biến khác nhau tham chiếu cùng 1 object. Thay đổi qua biến này thấy được qua biến kia.

Kiểu tham chiếu bao gồm:

  • String
  • Class
  • Array
  • Delegate
  • Interface

Tạo class (reference type):


public class Point { public int X; public int Y; }
var p1 = new Point();

So sánh Value Type và Reference Type trong C#

Gán biến kiểu tham chiếu → copy reference, KHÔNG copy object:


Point p2 = p1;

So sánh Value Type và Reference Type trong C#

Ví dụ so sánh


using System;

class Program
{
    static void Main()
    {
        // Value type
        var p1 = new Point { X = 10 };
        Point p2 = p1;
        p2.X = 20;
        Console.WriteLine("Value Type");
        Console.WriteLine(p1.X); // 10
        Console.WriteLine(p2.X); // 20

        // Reference type
        var u1 = new User { Age = 10 };
        User u2 = u1;
        u2.Age = 20;
        Console.WriteLine("Reference Type");
        Console.WriteLine(u1.Age); // 20
        Console.WriteLine(u2.Age); // 20
    }
}

public struct Point { public int X; public int Y; }
public class User { public int Age { get; set; } }

Kết quả đầu ra


Value Type
10
20
Reference Type
20
20