2009-08-18 39 views
6

thể trùng lặp:
What’s the difference between a parameter passed by reference vs. passed by value?gì là khác nhau giữa Passing bởi giá trị và Passing bằng cách tham khảo sử dụng C#

tôi gặp khó khăn trong việc hiểu sự khác nhau giữa đi qua bởi giá trị và đi ngang qua tham khảo. Ai đó có thể cung cấp một ví dụ C# minh họa sự khác biệt?

+3

Bản sao http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-reference-vs-passed-by-value –

+2

Đó 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á. –

+0

@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

Trả lời

16

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"); 
    } 
} 
5

Truyền theo giá trị nghĩa là một bản sao của một đối số được chuyển. Các thay đổi đối với bản sao đó không thay đổi bản gốc.

Truyền bằng tham chiếu có nghĩa là tham chiếu đến bản gốc được chuyển và các thay đổi đối với tham chiếu ảnh hưởng đến bản gốc.

Điều này không cụ thể đối với C#, nó tồn tại bằng nhiều ngôn ngữ.

0

Các tiêu hóa là:

Đi qua bằng cách tham chiếu được sử dụng khi bạn mong đợi chức năng/phương pháp để sửa đổi biến của bạn.

Đi qua giá trị khi bạn không làm như vậy.

Các vấn đề liên quan