2012-06-26 36 views
9

Vì vậy, tôi mới đến C# và tôi gặp khó khăn trong việc hiểu out. Trái ngược với chỉ trở về một cái gì đó từ một hàmC# out tham số vs trả về

using System; 
class ReturnTest 
{ 
    static double CalculateArea() 
    { 
     double r=5; 
     double area = r * r * Math.PI; 
     return area; 
    } 

    static void Main() 
    { 
     double output = CalculateArea(); 
     Console.WriteLine("The area is {0:0.00}", output); 
    } 
} 

so sánh với này

using System; 
class ReturnTest 
{ 
    static void CalculateArea(out double r) 
    { 
     r=5; 
     r= r * r * Math.PI; 
    } 

    static void Main() 
    { 
     double radius; 
     CalculateArea(out radius); 
     Console.WriteLine("The area is {0:0.00}",radius); 
     Console.ReadLine(); 
    } 
} 

Người đầu tiên là cách tôi thường sẽ làm điều đó. Có lý do nào để tôi có thể sử dụng số out thay vì chỉ một câu trả lại không? Tôi hiểu rằng ref cho phép liên lạc 2 chiều và tôi thường không nên sử dụng ref trừ khi chức năng đang làm điều gì đó với biến tôi đang gửi.

Tuy nhiên, có sự khác biệt giữa các câu lệnh trả lời và trả lại, như được hiển thị ở trên không? Cú pháp-khôn ngoan là có một lý do để ủng hộ một hay khác?

+8

Nghiên cứu 'Dictionary.TryGetValue' và' int.TryParse' và xem các ví dụ đó có giải thích tiện ích của 'out' không. –

+3

'out' chủ yếu được sử dụng khi bạn cần trả lại nhiều giá trị không liên quan từ một phương thức. Đồng thời, nó thường được sử dụng để mô phỏng con trỏ khi xen kẽ với mã nguồn gốc thông qua COM hoặc p/invoke. – dlev

+1

Hãy nhớ trong C/C++ chúng tôi có con trỏ. Khi bạn đưa con trỏ vào một hàm, bạn có thể sửa đổi nó trong hàm và giá trị sẽ thay đổi trong hàm gọi. ra khá nhiều điều tương tự. – carny666

Trả lời

13

Sử dụng tốt out thay vì return cho kết quả là mẫu Try mà bạn có thể thấy trong các API nhất định, ví dụ: Int32.TryParse(...). Trong mẫu này, giá trị trả về được sử dụng để báo hiệu thành công hoặc thất bại của hoạt động (trái ngược với một ngoại lệ) và tham số out được sử dụng để trả lại kết quả thực tế.

Một trong những lợi thế liên quan đến Int32.Parse là tốc độ, vì ngoại lệ nên tránh. Một số điểm chuẩn đã được trình bày trong câu hỏi khác này: Parsing Performance (If, TryParse, Try-Catch)

1

Khi một biến được quan tâm và trả về là OK. Nhưng nếu bạn muốn trả lại nhiều hơn 1 giá trị thì sao? Out giúp trong đó.

static void CalculateArea(out double r, out double Foo) 
{ 
    //Can return 2 values in terms of out variables. 
} 

static double CalculateArea(double r) 
{ 
    // Will return only one value. 
} 
2

Bạn có thể có nhiều ra các thông số, vì vậy nếu bạn cần phải trả lại nhiều giá trị, đó là một chút dễ dàng hơn vì tạo ra một lớp học đặc biệt cho các giá trị trở lại của bạn.

+0

không thể tin rằng tôi đã không nghĩ về điều này nhờ –

4

Chỉ thời gian tôi có xu hướng sử dụng out là khi tôi cần nhiều thứ được trả về từ một phương pháp duy nhất. Out cho phép bạn tránh gói nhiều đối tượng vào một lớp để trả lại. Xem ví dụ tại Microsoft Out page.

8

Từ khóa out chủ yếu được sử dụng khi bạn muốn trả về nhiều giá trị từ một phương pháp, mà không phải quấn các giá trị trong một đối tượng.

Ví dụ là phương pháp Int32.TryParse, có cả giá trị trả lại (boolean đại diện cho thành công của lần thử) và tham số out nhận giá trị nếu phân tích thành công.

Phương thức có thể trả về đối tượng chứa cả boolean và số nguyên, nhưng điều đó sẽ cần cho đối tượng được tạo trên heap, giảm hiệu suất của phương thức.

+0

Tôi cũng tự hỏi về sự khác biệt hiệu suất (nếu có). Đến từ môi trường C++, đối số là việc sao chép một đối tượng khi được trả về bởi giá trị sẽ đắt hơn. Điều này cũng đúng cho C#? Tôi có nghĩa là nếu bạn xây dựng một thương hiệu lớn đối tượng mới trong chức năng và trả lại nó, nó sẽ được sao chép vào bất cứ điều gì bạn đang gán cho? Trái ngược với việc tạo đối tượng và thay đổi nó thông qua từ khóa ngoài? Hoặc là điều này không liên quan trong C#? – Reasurria

+0

@Reasurria: Nếu bạn tạo một đối tượng và trả về nó, nó chỉ là tham chiếu được trả về, các đối tượng không được nhân bản. Trong các đối tượng .NET chỉ được nhân bản nếu bạn đặc biệt sao chép chúng, việc truyền các đối tượng xung quanh không tạo các bản sao mới. – Guffa

+0

Cảm ơn tôi sẽ ghi nhớ điều này. – Reasurria

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