Không, nhưng bạn có thể sử dụng một đại biểu (ví dụ Action
) thay thế.
Lấy cảm hứng một phần bởi câu trả lời của Robin R khi đối mặt với một tình huống mà tôi nghĩ rằng tôi muốn có một tham số ngoài tùy chọn, thay vào đó tôi đã sử dụng một Action
đại biểu. Tôi đã mượn mã ví dụ của anh ấy để sửa đổi để sử dụng Action<int>
để hiển thị sự khác biệt và tương đồng:
public string foo(string value, Action<int> outResult = null)
{
// .. do something
outResult?.Invoke(100);
return value;
}
public void bar ()
{
string str = "bar";
string result;
int optional = 0;
// example: call without the optional out parameter
result = foo (str);
Console.WriteLine ("Output was {0} with no optional value used", result);
// example: call it with optional parameter
result = foo (str, x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
// example: call it with named optional parameter
foo (str, outResult: x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
}
Điều này có lợi thế là biến tùy chọn xuất hiện trong nguồn dưới dạng int bình thường (trình biên dịch bao bọc nó trong một lớp đóng, thay vì chúng ta gói nó một cách rõ ràng trong một lớp do người dùng định nghĩa).
Biến cần khởi tạo rõ ràng vì trình biên dịch không thể giả sử rằng Action
sẽ được gọi trước khi thoát lệnh gọi hàm.
Nó không phù hợp với tất cả các trường hợp sử dụng, nhưng hoạt động tốt cho trường hợp sử dụng thực sự của tôi (một chức năng cung cấp dữ liệu cho thử nghiệm đơn vị và khi thử nghiệm đơn vị mới cần truy cập vào một số trạng thái bên trong không có trong giá trị trả về).