Tôi đang xem cách ParameterInfo.IsOptional
được định nghĩa (tôi đang thêm hỗ trợ tham số mặc định vào khung IOC nội bộ), và dường như với tôi rằng, khi đúng, không có đảm bảo rằng ParameterInfo.DefaultValue
(hoặc thực sự ParameterInfo.RawDefaultValue
) là thực sự các giá trị mặc định sẽ được áp dụng.Tham số mặc định và phản ánh: nếu ParameterInfo.IsOptional thì DefaultValue luôn đáng tin cậy?
Nếu bạn nhìn vào MSDN example given for IsOptional
, có vẻ như IL có thể xác định tham số là tùy chọn nhưng không được cung cấp mặc định (với điều kiện là ParameterAttributes.HasDefault
phải được cung cấp rõ ràng). I E. có khả năng dẫn đến một tình huống mà một kiểu tham số là, giả sử, Int32
, ParameterInfo.IsOptional
là đúng, nhưng ParameterInfo.DefaultValue
là rỗng.
Ngôn ngữ của tôi là C#, do đó tôi có thể làm việc với những gì mà trình biên dịch sẽ thực hiện. Trên cơ sở đó tôi có thể có một thử nghiệm đơn giản như sau (parameter
đây là một trường hợp ParameterInfo
, và phương pháp này có nghĩa là để trở về một thể được sử dụng như là đối số thời gian chạy cho các tham số):
if(no_config_value)
{
if(!parameter.IsOptional) throw new InvalidOperationException();
//it's optional, so read the Default
return parameter.DefaultValue;
}
else
return current_method_for_getting_value();
Nhưng tôi m nghĩ rằng một số ngôn ngữ (và tôi muốn có được quyền này ở cấp IL, thay vì chỉ dựa trên những gì một trình biên dịch cụ thể làm) có thể đặt onus trên người gọi để xác định giá trị mặc định sẽ được sử dụng, nếu có , default(parameter.ParameterType)
sẽ cần phải theo thứ tự.
Đây là nơi thú vị hơn một chút, bởi vì DefaultValue
, rõ ràng là DBNull.Value
(theo the documentation for RawValue
) nếu không có mặc định. Sẽ không tốt nếu tham số thuộc loại object
và IsOptional==true
!
Sau khi thực hiện đào hơn một chút, tôi hy vọng rằng cách đáng tin cậy để giải quyết việc này là để cơ thể đọc ParameterInfo.Attributes
thành viên, đọc bitflags riêng đầu tiên để kiểm tra ParameterAttributes.Optional
và sau đó séc ParameterAttributes.Default
. Chỉ khi có cả hai, thì đọc ParameterInfo.DefaultValue
sẽ chính xác.
Tôi sẽ bắt đầu viết mã và viết các bài kiểm tra, nhưng tôi hỏi với hy vọng rằng có ai đó có nhiều kiến thức về IL hơn có thể xác nhận những nghi ngờ của tôi và hy vọng rằng điều này sẽ đúng cho bất kỳ IL- dựa trên ngôn ngữ (do đó tránh sự cần thiết phải giả lập vô số thư viện bằng các ngôn ngữ khác nhau!).
Tôi sẽ kiểm tra 'Test2' một! – nawfal
Cũng không phải tất cả các ngôn ngữ đều yêu cầu bạn chỉ định một giá trị mặc định trong chữ ký hàm khi khai báo một tham số tùy chọn. Tôi không có chuyên gia, nhưng dường như trong trường hợp F #, các giá trị mặc định được áp dụng trong phần thân hàm - lợi ích của việc bạn có thể giữ mặc định nhất quán khi bạn triển khai phiên bản mới của assembly (trong khi với C# và VB mô hình, bạn có thể biên dịch một thư viện với một mặc định khác nhau ngày hôm nay, nhưng hội đồng biên soạn với phiên bản của ngày hôm qua vẫn sẽ gửi mặc định cũ). Tài liệu F # là [ở đây] (http://msdn.microsoft.com/en-gb/library/dd233213.aspx) –
... Vì vậy, ví dụ F # cho chúng ta một mẫu tốt cho lý do tại sao bạn sử dụng mẫu '[Tùy chọn]' thay vì 'int p1 = 0' trong C#: có thể vì bạn luôn mong đợi mặc định là kiểu mặc định, và sau đó bạn sẽ áp dụng mặc định khác trong phần thân hàm. –