2013-04-24 45 views
9

Đây là một câu hỏi tiếp theo của How do I get default values of optional parameters?Sự khác nhau giữa ParameterInfo.DefaultValue và ParameterInfo.RawDefaultValue

Từ documentation, DefaultValue:

Gets một giá trị chỉ ra giá trị mặc định nếu tham số có giá trị mặc định .

Thuộc tính này chỉ được sử dụng trong ngữ cảnh thực thi. Trong ngữ cảnh chỉ phản ánh , hãy sử dụng thuộc tính RawDefaultValue thay thế.

Giá trị mặc định được sử dụng khi giá trị thực tế không được chỉ định trong cuộc gọi phương thức . Một tham số có thể có một giá trị mặc định là null. Đây là khác với trường hợp giá trị mặc định không được xác định.

Từ documentation, RawDefaultValue:

Gets một giá trị chỉ ra giá trị mặc định nếu tham số có giá trị mặc định .

Thuộc tính này có thể được sử dụng trong cả ngữ cảnh thực thi và bối cảnh chỉ phản chiếu.

Giá trị mặc định được sử dụng khi giá trị thực tế không được chỉ định trong cuộc gọi phương thức . Một tham số có thể có một giá trị mặc định là null. Đây là khác với trường hợp giá trị mặc định không được xác định.

Tài liệu tương tự như vậy ngoại trừ tài liệu dành cho ngữ cảnh phản chiếu và không khác. Sự khác biệt đó là gì? Khi nào là DefaultValue được sử dụng mà không có sự phản ánh? Tôi có nghĩa là làm thế nào để chúng ta có được một giá trị mặc định mà không có sự phản ánh? Tui bỏ lỡ điều gì vậy?

Cập nhật

Tôi tạo ra hai quá tải như thế này:

public void Required(string value) 
{ 

} 
public void Optional(string value = "", int i = -1) 
{ 

} 

tôi thử nghiệm với:

var f = requiredInfo.GetParameters().Select(p => p.DefaultValue).ToArray(); 
var g = requiredInfo.GetParameters().Select(p => p.RawDefaultValue).ToArray(); 

var h = optionalInfo.GetParameters().Select(p => p.DefaultValue).ToArray(); 
var i = optionalInfo.GetParameters().Select(p => p.RawDefaultValue).ToArray(); 

//f equals g and h equals i in every way! 

Vì vậy, sự khác biệt là những gì cho rằng các chương trình thử nghiệm của tôi (tất cả trong suy nghĩ ngữ cảnh) không có sự khác biệt nào cả?

+1

Có thể liên kết đó sẽ giúp bạn với ngữ cảnh chỉ phản chiếu: http://msdn.microsoft.com/en-us/library/ms172331.aspx – rpeshkov

Trả lời

8

Có sự khác biệt tinh tế nhưng đáng kể giữa "trong bối cảnh phản chiếu" và "ngữ cảnh chỉ phản chiếu". Các "phản ánh chỉ bối cảnh" là đề cập đến một cái gì đó rất cụ thể:

Đó là một cách để nạp một assembly chỉ kiểm tra và có lợi thế riêng biệt của không yêu cầu bất kỳ hội phụ thuộc được nạp hoặc thậm chí có mặt.

Vì bạn dường như có mọi ý định thực hiện một số mã bạn đang phản ánh, bối cảnh chỉ phản chiếu sẽ bị hạn chế sử dụng cho bạn.

+0

thật thú vị khi được biết. Tôi sẽ gắn bó với 'DefaultValue' rồi. Lớp 'ParameterInfo' khá gây hiểu nhầm. Thời gian cho tôi để tạo ra một câu hỏi khác về sự khác biệt giữa 'IsOptional' và' HasDefaultValue' – nawfal

+3

Vì vậy, tại sao bạn không sử dụng 'RawDefaultValue' nếu bạn không ở trong bối cảnh chỉ phản chiếu? – svick

+0

@svick trong trường hợp của tôi, chỉ thực thi bối cảnh quan trọng, và tôi có chính sách này thực hiện các công cụ tối thiểu trần trừ khi yêu cầu :) 'RawDefaultValue' có ý nghĩa quá. Vui lòng gắn thẻ tên của tôi, nếu không tôi sẽ không được thông báo. – nawfal

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