Theo tài liệu hướng dẫn trên lớp ConditionalAttribute
:Có phải ConditionalAttribute phải loại bỏ toàn bộ các dòng hoặc chỉ các cuộc gọi phương thức?
Áp dụng ConditionalAttribute cho một phương pháp chỉ để trình biên dịch rằng một cuộc gọi phương pháp này sẽ không sử biên dịch vào Microsoft trung ngôn ngữ (MSIL) trừ khi có điều kiện biểu tượng biên dịch được liên kết với ConditionalAttribute được định nghĩa.
Với tôi điều này nói rằng thuộc tính Conditional
chỉ thay đổi hành vi ở cấp độ cuộc gọi phương thức riêng lẻ. Nhưng xem xét các đoạn mã sau:
class InstanceType
{
public InstanceType DoSideEffects()
{
Console.WriteLine("Side effects!");
return this;
}
public InstanceType DoMoreSideEffects()
{
Console.WriteLine("More side effects!");
return this;
}
[Conditional("DEBUG")]
public void ConditionalMethod()
{
Console.WriteLine("Conditional method run.");
}
}
class Program
{
static void Main()
{
var x = new InstanceType();
// The compiler appears to strip out this entire line
// in a Release build.
x.DoSideEffects().DoMoreSideEffects().ConditionalMethod();
var y = new InstanceType();
// When each method call appears on its own line,
// the first two methods are included as expected.
y.DoSideEffects();
y.DoMoreSideEffects();
y.ConditionalMethod();
}
}
Hãy so sánh các kết quả đầu ra của Debug và phát hành xây dựng:
DEBUG RELEASE Side effects! Side effects! More side effects! More side effects! Conditional method run. Side effects! More side effects! Conditional method run.
là hành vi này quy định ở đâu đó? Tôi đã nghĩ rằng cả hai bản dựng được cho là có cùng đầu ra ngoại trừ các dòng đọc "Chạy phương thức có điều kiện".
sự hiểu biết của tôi về '[Conditional]' cũng giống như bạn, và Tôi nghĩ rằng bạn đang thấy hiệu quả của một tối ưu hóa diễn ra ở đây. IL trông như thế nào trong chế độ phát hành? –
Thú vị đủ, ngay cả Visual Studio (hoặc là nó ReSharper?) Màu sắc toàn bộ dòng màu xám/không sử dụng trong trường hợp đầu tiên, nếu bạn không xác định DEBUG. Trong khi thứ hai, nó chỉ màu sắc cuộc gọi đến ConditionalMethod() màu xám/không sử dụng. –
bản sao có thể có của [Tại sao thuộc tính có điều kiện của Thuộc tính .NET bị loại bỏ?] (Http://stackoverflow.com/questions/410865/why-does-nets-conditional-attribute-cause-side-effects-to -be-removed) –