Đây là cơ chế mặc định để truyền tham số cho phương thức. Khi phương thức được gọi, một vị trí bộ nhớ mới được tạo cho mỗi tham số giá trị. Giá trị của tham số thực tế được sao chép vào đó. Do đó, thay đổi tham số bên trong phương thức không ảnh hưởng đến đối số gốc.
Ví dụ
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void Swap(int x, int y)
{
int temp;
temp = x; // lưu x
x = y; // gán y vào x
y = temp; // gán temp vào y
// Chỉ hoán đổi bản sao cục bộ
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
int a = 100;
int b = 200;
Console.WriteLine("Trước hoán đổi, a = {0}", a);
Console.WriteLine("Trước hoán đổi, b = {0}", b);
n.Swap(a, b); // Truyền bằng giá trị
Console.WriteLine("Sau hoán đổi, a = {0}", a);
Console.WriteLine("Sau hoán đổi, b = {0}", b);
Console.ReadLine();
}
}
}
Kết quả
Trước hoán đổi, a = 100 Trước hoán đổi, b = 200 Sau hoán đổi, a = 100 Sau hoán đổi, b = 200
Giải thích
avàbgiữ nguyên giá trị sau khi gọiSwap- Bên trong
Swap,xvàylà bản sao củaavàb - Hoán đổi chỉ xảy ra trên bản sao
Khi nào dùng by value?
- Kiểu giá trị đơn giản (int, double, bool, struct nhỏ)
- Không muốn phương thức thay đổi giá trị gốc
- Mặc định an toàn, dễ hiểu
Lưu ý: Với reference type (class, array, string), truyền by value nghĩa là sao chép tham chiếu - vẫn có thể sửa đổi đối tượng được tham chiếu, nhưng không thể thay đổi tham chiếu trỏ đến đối tượng mới.