2011-11-21 27 views
9

Thật sự tôi đang làm một danh sách như một tham số tài liệu tham khảo như sau:Thực hành tốt nhất: tham số ref hoặc giá trị trả về?

public static List ListMethod(List result) 

tôi thấy một số người làm theo cách này quá:

public static void ListMethod(ref List result) 

Nếu tôi không sai, "tôi" phương pháp cũng có tham số list làm tham chiếu và bạn có thể sử dụng nó giống như cách "khác" trong phương thức của mình.

Nhưng có vẻ như "sạch" hơn với tôi khi bạn nhập tham số, hãy làm gì đó với nó và trả về giá trị trả về của phương thức.

Bất kỳ đối số nào tốt cho hoặc chống lại một phương pháp hay phương pháp khác?

+0

Đó là danh sách? tại sao gửi nó bằng cách ref nó là những gì bạn đang cố gắng để đạt được? –

+3

Với quá trình chuyển tiếp, chuyển tiếp, tham chiếu đến bản sao heap được thực hiện trong ngăn xếp và được chuyển đến phương thức callee. Nếu sử dụng ref, tham chiếu tương tự được sử dụng làm đối số truyền. – Zenwalker

+1

Tại sao bạn nghĩ rằng bạn cần phải trả về một 'Danh sách' trong phương pháp đầu tiên của bạn và không trả lại bất cứ điều gì trong lần thứ hai? – BoltClock

Trả lời

30

Đó là khả năng mà bạn không cần phải sử dụng ref - nhưng có một sự khác biệt.

Thông thường khi tôi thấy mọi người sử dụng ref cho tham số loại tham chiếu, đó là vì họ không hiểu cách tham số truyền hoạt động. Nhưng nếu phương pháp của bạn có một cái gì đó như thế này:

result = new List(); 
... 

sau đó trong trường hợp đầu tiên người gọi sẽ không thấy sự thay đổi, trong khi ở trường hợp thứ hai biến của người gọi sẽ được thay đổi để tham khảo các đối tượng mới.

Xem article on parameter passing của tôi để biết thêm chi tiết.

+0

Cảm ơn 'Jon Skeet' – Dotnet

3

Nếu bạn vừa trả về một Danh sách, bạn nên luôn sử dụng danh sách đầu tiên vì nó cho thấy ý định đó.

Phiên bản với ref cho tôi biết rằng tôi có thể bắt đầu với danh sách và phương pháp của bạn sẽ sửa đổi danh sách tôi đã gửi hoặc thậm chí thay đổi nó bằng danh sách khác. Nếu đó là ý định của bạn, hãy làm điều đó.

Nhưng nếu phương thức allways trả về danh sách mới, hãy sử dụng giá trị trả lại thay vì tham số ref.

Một lưu ý ở phía: bạn có thể sử dụng out thay vì ref để hiển thị ý định của bạn trả lại một danh sách mới, nhưng đây chỉ là một thói quen tốt nếu bạn đang sử dụng giá trị trả về cho cái gì khác.

11

Không, phương pháp của bạn không sử dụng thông số ref. Giá trị mặc định là pass by value.

Sự khác biệt là, phương pháp của bạn chỉ có thể sửa đổi nội dung trong danh sách của bạn chứ không phải tham chiếu thông số result trỏ đến.

Cách tiếp cận tốt nhất là gì? Nó phụ thuộc vào phương pháp của bạn là nghĩa vụ phải làm.

Khi phương pháp của bạn sửa đổi danh sách hoặc trả về dữ liệu mới, bạn nên sử dụng giá trị trả về. Tốt hơn nhiều để hiểu mã của bạn hoạt động hơn là sử dụng tham số ref.

Lợi ích khác của giá trị trả lại là khả năng sử dụng phương pháp chuỗi.

Bạn có thể viết mã như thế này mà vượt qua tham số danh sách từ một phương pháp khác:

ListMethod1(list).ListMethod2(list)... 
+3

+1 cho khả năng thực hiện chuỗi phương pháp. Bạn thậm chí có thể làm điều đó * và * sửa đổi một tham số là tốt, nếu bạn thực sự muốn; một 'kết quả trả về;' không phải là rất tốn kém về cả LOC, CPU hoặc phức tạp, và có thể làm cho cuộc sống dễ dàng hơn nhiều cho người tiêu dùng chức năng. –

1

Một điều đặc biệt về thông số ref ở đây là - "Một biến thông qua với ref phải được gán giá trị đầu tiên. ". Vì vậy, nếu bạn muốn làm cho nó nghiêm ngặt cho các phương pháp gọi để gán giá trị trước khi cuộc gọi bạn có thể có thể sử dụng tham số ref.

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