Nói chung, hãy đọc my article about parameter passing.
Ý tưởng cơ bản là:
Nếu đối số được truyền bằng tham chiếu, sau đó thay đổi giá trị tham số trong phương pháp này sẽ ảnh hưởng đến lập luận là tốt.
Phần tinh tế là nếu tham số là một loại tài liệu tham khảo, sau đó thực hiện:
someParameter.SomeProperty = "New Value";
không thay đổi giá trị của tham số. Tham số này chỉ là một tham chiếu, và thông số trên không thay đổi tham số tham chiếu đến, chỉ là dữ liệu trong đối tượng. Dưới đây là một ví dụ về thực thay đổi giá trị của tham số:
someParameter = new ParameterType();
Bây giờ cho ví dụ:
ví dụ đơn giản: đi qua một int bởi ref hoặc bằng giá trị
class Test
{
static void Main()
{
int i = 10;
PassByRef(ref i);
// Now i is 20
PassByValue(i);
// i is *still* 20
}
static void PassByRef(ref int x)
{
x = 20;
}
static void PassByValue(int x)
{
x = 50;
}
}
phức tạp hơn ví dụ: sử dụng các loại tham chiếu
class Test
{
static void Main()
{
StringBuilder builder = new StringBuilder();
PassByRef(ref builder);
// builder now refers to the StringBuilder
// constructed in PassByRef
PassByValueChangeContents(builder);
// builder still refers to the same StringBuilder
// but then contents has changed
PassByValueChangeParameter(builder);
// builder still refers to the same StringBuilder,
// not the new one created in PassByValueChangeParameter
}
static void PassByRef(ref StringBuilder x)
{
x = new StringBuilder("Created in PassByRef");
}
static void PassByValueChangeContents(StringBuilder x)
{
x.Append(" ... and changed in PassByValueChangeContents");
}
static void PassByValueChangeParameter(StringBuilder x)
{
// This new object won't be "seen" by the caller
x = new StringBuilder("Created in PassByValueChangeParameter");
}
}
Nguồn
2009-08-18 10:48:03
Bản sao http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-reference-vs-passed-by-value –
Đó là * loại * một bản sao, nhưng điều này đặc biệt yêu cầu các ví dụ C# - trong khi không có C# ví dụ nào trong câu hỏi được tham chiếu. Rất nhiều cuộc thảo luận tốt * chung, chắc chắn, nhưng tôi không nghĩ rằng nó thực sự đau khổ để có những ngôn ngữ cụ thể quá. –
@Jon Skeet: Không phải là giải pháp đúng để gắn một câu trả lời với cú pháp C# vào câu hỏi hiện tại? Có lẽ đang chỉnh sửa câu trả lời hiện có. – dmckee