2013-02-09 18 views
12

Có cách nào để viết C# phương pháp dưới đây:Làm thế nào để thiết lập tham số tùy chọn mà không cần thời gian biên dịch liên tục

public string Download(Encoding contentEncoding = null) { 
    defaultEncoding = contentEncoding ?? Encoding.UTF8; 
    // codes... 
} 

với một tham số mặc định thêm vào để nó trông như thế này:

public string Download(Encoding contentEncoding = Encoding.UTF8) { 
    // codes... 
} 

không sử dụng hằng số biên dịch?

Trả lời

15

Tóm lại. Số

Các thông số tùy chọn được yêu cầu phải là hằng số thời gian biên dịch hoặc loại giá trị.

Từ Named and Optional Arguments (C# Programming Guide) trên MSDN:

Mỗi tham số tùy chọn có giá trị mặc định như một phần của định nghĩa của nó. Nếu không có đối số nào được gửi cho tham số đó, giá trị mặc định sẽ được sử dụng. Giá trị mặc định phải là một trong các loại biểu thức sau:

  • một biểu thức không đổi;
  • biểu thức của biểu mẫu new ValType(), trong đó ValType là loại giá trị, chẳng hạn như enum hoặc cấu trúc;
  • biểu thức của biểu mẫu default(ValType), trong đó ValType là loại giá trị.

gì bạn dường như muốn đạt được có thể được thực hiện bằng cách làm quá tải:

public string Download() 
{ 
    return Download(Encoding.UTF8); 
} 

public string Download(Encoding contentEncoding) 
{ 
    defaultEncoding = contentEncoding ?? Encoding.UTF8; 
    // codes... 
} 

Lưu ý rằng điều này không hoàn toàn giống như các tham số tùy chọn, như giá trị mặc định được cứng mã hoá vào người gọi với các tham số tùy chọn (đó là lý do tại sao các hạn chế cho chúng tồn tại).

+1

Với giải pháp này, ông thậm chí có thể muốn ném 'ArgumentNullException' trong tình trạng quá tải thứ hai khi 'contentEncoding' là null. –

6

Sử dụng quá tải:

public string Download(Encoding contentEncoding) 
{ 
    // codes... 
} 

public string Download() 
{ 
    return Download(Encoding.UTF8); 
} 
4
public static string Download(Encoding encoder = null) 
{ 
    if (encoder == null) 
     encoder = Encoding.Default 


    string returnVal=""; 
    // do something 

    return returnVal; 
} 
+0

ngắn gọn. encoder == encoder ?? Encoding.Default – BrilBroeder

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