Đối tượng không được thông qua cả. Theo mặc định, đối số được ước tính và giá trị của nó được truyền, theo giá trị, là giá trị ban đầu của tham số của phương thức bạn đang gọi. Bây giờ điểm quan trọng là giá trị là một tham chiếu cho các loại tham chiếu - một cách để đến một đối tượng (hoặc null). Thay đổi đối tượng đó sẽ được hiển thị từ người gọi. Tuy nhiên, việc thay đổi giá trị của tham số để tham chiếu đến một đối tượng khác sẽ không hiển thị khi bạn đang sử dụng pass by value, đây là mặc định cho tất cả các loại.
Nếu bạn muốn sử dụng tham chiếu qua, bạn phải sử dụng out
hoặc ref
, cho dù loại tham số là loại giá trị hay loại tham chiếu. Trong trường hợp đó, chính biến đó được truyền bằng tham chiếu, vì vậy tham số sử dụng cùng một vị trí lưu trữ làm đối số - và các thay đổi đối với chính tham số được người gọi nhìn thấy.
Vì thế:
public void Foo(Image image)
{
// This change won't be seen by the caller: it's changing the value
// of the parameter.
image = Image.FromStream(...);
}
public void Foo(ref Image image)
{
// This change *will* be seen by the caller: it's changing the value
// of the parameter, but we're using pass by reference
image = Image.FromStream(...);
}
public void Foo(Image image)
{
// This change *will* be seen by the caller: it's changing the data
// within the object that the parameter value refers to.
image.RotateFlip(...);
}
Tôi có một bài viết đi sâu vào chi tiết hơn rất nhiều về vấn đề này . Về cơ bản, "vượt qua tham chiếu" không có nghĩa là bạn nghĩ nó có nghĩa gì.