2008-11-11 29 views

Trả lời

47

Vâng, tôi có an article on what ref/out do - nhưng không thảo luận bạn có nên sử dụng chúng hay không.

Về cơ bản, các tham số out thường là dấu hiệu cho thấy bạn muốn trả về hai kết quả một cách hiệu quả từ một phương thức. Đó là thường là mùi mã - nhưng có một số trường hợp (đáng chú ý nhất là với mẫu TryXXX) nơi bạn thực sự muốn trả lại hai mẩu thông tin vì lý do chính đáng và không có ý nghĩa gì nhiều khi đóng gói chúng lại với nhau.

Nói cách khác, tránh ra/ref nơi bạn có thể làm điều đó một cách dễ dàng, nhưng không đi ồ ạt ra khỏi con đường của bạn để tránh chúng.

+1

Câu cuối cùng của bạn là lời khuyên tốt, vững chắc, thực dụng. –

6

Trong hầu hết các trường hợp, tôi khuyên bạn không nên sử dụng tham số Out. Về cơ bản, họ thêm các hiệu ứng phụ vào mã của bạn và có thể là một cơn ác mộng khi nói đến gỡ lỗi.

Có một bài viết trên MSDN về Out thông số có sẵn ở đây: http://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx

1

Tôi nghĩ rằng họ có thực sự hữu ích khi cần thiết.

Bài viết Msdn cho cả tham số ref và out.

0

Câu hỏi hay. Câu trả lời của tôi là tôi không đặc biệt thích chúng, nhưng tôi sử dụng chúng trong một trong các dự án của tôi, nơi nhiều giá trị trả về là phổ biến. Tôi có một thư viện dữ liệu tài chính trả về giá thực tế (hoặc null/zero), một mã lỗi chính và một mã lỗi nhỏ. Thư viện có hàng chục đến hàng trăm phương thức, và mỗi mã lỗi là một kiểu khác nhau, vì vậy việc tạo các lớp tùy chỉnh cho từng phương thức và trả về một thể hiện của nó sẽ rất khó sử dụng.

0

Out thông số rất hữu ích khi bạn cần phải trả lại nhiều hơn một đối tượng như là kết quả của một hàm. Để đôi mắt của tôi,

void doSomeThing(Thing toDoItTo, 
       out OtherThing result1, 
       out AnotherThing result2) 
{ 
    ... 
} 

OtherThing y; 
AnotherThing z; 

doSomeThing(x, out y, out z); 

y.method1(); 
z.method2(); 

là sạch hơn rất nhiều so với

struct DoSomeThingResults 
{ 
    public OtherThing Result1; 
    public OtherThing Result2; 
} 

DoSomeThingResults doSomeThing(Thing toDoItTo) 
{ 
    ... 
} 

DoSomethingResults results = doSomeThing(x); 

results.Result1.method1(); 
results.Result2.method2(); 

và thêm vào đó, sử dụng ra các thông số có nghĩa là kết quả được đảm bảo để được giao.

4

Trong trường hợp không có bộ dữ liệu, đôi khi chúng là cách sạch nhất để làm việc. Tôi thường ghét họ, mặc dù.

F # có một số đường cú pháp đẹp để xử lý chúng. Thay vì làm cho tôi đối phó với các tham số out, nó xử lý chúng như là các phương thức trả về các bộ dữ liệu thay thế. Các TryParse phương pháp khác nhau kết thúc trở về hai tuples yếu tố:

let success, value = Int32.TryParse("1234") 
(* success is true *) 
(* value is 1234 *) 

Đó là khá tiện dụng, và không làm cho tôi cảm thấy bẩn.

+0

Tôi cũng thích đường này! – BuddyJoe

+0

Đối với trường hợp cụ thể này, bạn có thể sử dụng Nullable khá dễ dàng, với phương thức trình bao trả về giá trị rỗng cho "phân tích cú pháp không thành công". Nó không hoàn toàn gọn gàng như giải pháp F #, nhưng đáng lưu ý nếu bạn đang sử dụng C# và không muốn tham số ngoài. –

-1

nó không phải là ở tất cả xấu để sử dụng Out

hãy thử precising những lợi ích:

using ref force us to initialize it so we are letting the ref variable to place in heap and consume some spaces . 

in most cases we return null if the operation has some none logic conditions 

but with Out we avoid consuming the heap and refspace 
Các vấn đề liên quan