2013-08-08 30 views
10

Tôi có một lớp học xử lý tất cả các giao dịch API trong ứng dụng tôi đang làm việc. Khái quát chung cho các phương pháp của nó trông như thế này:Bồi thường cho việc thiếu tham số 'out' trong các phương thức không đồng bộ.

public static async Task<bool> APICall(int bla) 
     { 
      HttpResponseMessage response; 
      bool res; 

      // Post/GetAsync to server depending on call + other logic 
      return res; 
     } 

Những gì tôi muốn làm là để có thể cũng để trả lại response.StatusCode cho người gọi, nhưng vì chúng ta không được phép sử dụng 'ra' thông số với các phương thức không đồng bộ nó làm phức tạp mọi thứ một chút.

Tôi đã suy nghĩ về việc trả về một bộ chứa cả bool và mã phản hồi, có cách nào tốt hơn để làm điều này không?

+0

Tại sao không trả lại 'HttpResponseMessage'? – Artless

+0

@Trickery Bởi vì có một số logic thực hiện (phân tích cú pháp jason vv) mà tôi muốn chứa trong phương pháp. – Darajan

+0

Nếu bạn đang trả về Mã trạng thái của Phản hồi HTTP, tại sao bạn cần boolean? Mục đích của nó là gì khi bạn trả lại mã cho biết liệu yêu cầu có thành công hay không? – Artless

Trả lời

11

Tôi đã suy nghĩ về việc trả lại một tuple chứa cả bool và mã phản hồi, là có một cách tốt hơn để làm điều này?

Bạn có thể tạo một lớp cụ thể để giữ kết quả. Cá nhân tôi không thực sự thích tuples, bởi vì các tên như Item1 hoặc Item2 không nói gì về các giá trị.

class APICallResult 
{ 
    public bool Success { get; set; } 
    public HttpStatusCode StatusCode { get; set; } 
} 

    public static async Task<APICallResult> APICall(int bla) 
    { 
     HttpResponseMessage response; 
     bool res; 

     // Post/GetAsync to server depending on call + other logic 
     return new APICallResult { Success = res, StatusCode = response.StatusCode }; 
    } 
+2

+1. Tuples là khủng khiếp. Họ không tiết kiệm được gì về thông tin được trả về. – jgauffin

+4

+1 Tupples không phải là khủng khiếp, nhưng nên được sử dụng ở những nơi chính xác. Thay vì một lớp riêng trong một chuỗi LINQ chẳng hạn. Không phải là một phần của giao diện công khai. –

+1

Rất may C# 7 đã giới thiệu các bộ dữ liệu ở mức độ thực, ngôn ngữ (với tên và mọi thứ). BÂY GIỜ họ cuối cùng cũng tuyệt vời! – Marchy

8

Sử dụng Tuple<x, y> để trả lại nhiều hơn giá trị. Ví dụ, để trả lại một int và một chuỗi:

return Tuple.Create(5, "Hello"); 

và loại là Tuple<int, string>

Hoặc bạn có thể mô phỏng các out/ref với một mảng ... Nếu bạn vượt qua phương pháp này một mảng của một yếu tố, nó giống như đi qua một ref hoặc một out (tùy thuộc vào ai sẽ lấp đầy phần tử):

MyMethod(new int[1] { 6 }); 

void MyMethod(int[] fakeArray) 
{ 
    if (fakeArray == null || fakeArray.Length != 1) 
    { 
     throw new ArgumentException("fakeArray"); 
    } 

    // as a `ref` 
    fakeArray[0] = fakeArray[0] + 1; 

    // as an `out` 
    fakeArray[0] = 10; 
} 

hoặc sử dụng đối tượng phức tạp ...

class MyReturn 
{ 
    public string Text { get; set; } 
    public int Value { get; set; } 
} 

MyMethod(new MyReturn()); 

void MyMethod(MyReturn ret) 
{ 
    ret.Text = "Hello"; 
    ret.Value = 10; 
} 

Done ...

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