2014-10-09 14 views
12

Tôi có một lớp học rất đơn giản sử dụng .NET Mã Hợp đồng:Tại sao phân tích tĩnh bỏ qua đôi <= and > = yêu cầu?

public class ContractSquareRoot 
{ 
    /// <summary> 
    /// Makes your life much easier by calling Math.Sqrt for you. Ain't that peachy. 
    /// </summary> 
    /// <param name="value">The value to calculate the square root from. No negatives!</param> 
    /// <returns>The square root of the given value. Obviously always > 0.</returns> 
    public double CalculateSquareRoot(double value) 
    { 
     Contract.Requires<ArgumentException>(0 <= value); 
     Contract.Ensures(0 <= Contract.Result<double>()); 

     double squareRoot = Math.Sqrt(value); 

     return squareRoot; 
    } 
} 

Khi tôi gọi phương thức với một giá trị tiêu cực, tôi hy vọng các phân tích mã tĩnh để cảnh báo tôi về điều đó.

class Program 
{ 
    static void Main(string[] args) 
    { 

     var barMansSquareroot = new ContractSquareRoot(); 

     // This should not be possible... 
     barMansSquareroot.CalculateSquareRoot(-42); 

    } 
} 

Nhưng ngay cả khi Contract.Requires không ném ngoại lệ mong muốn, phân tích mã tĩnh đánh dấu mọi xác nhận là chính xác. Điều thú vị là, nó cảnh báo tôi về vi phạm khi tôi thay đổi loại giá trị thành int hoặc nếu tôi thay thế <= bằng <. Hành vi sai trái được giới hạn ở doublefloat. Tôi giả sử nó có một cái gì đó để làm với độ chính xác của các giá trị dấu chấm động.

Nó thậm chí hoạt động khi tôi xây dựng các yêu cầu như thế này:

Contract.Requires<ArgumentException>(!(0 > value)); 

Có phải đó là một lỗi hay tôi làm điều gì sai?

+0

không quan tâm, tại sao bạn không cho phép 0 làm giá trị hợp lệ? – thumbmunkeys

+0

tôi muốn cho phép 0 làm giá trị hợp lệ. hợp đồng phải đảm bảo rằng mọi giá trị là> = 0. – vlow

+2

Chắc chắn thú vị, tôi sẽ cố gắng liên hệ với Francesco, https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970 –

Trả lời

1

Tôi hy vọng bạn có thể bỏ lỡ cài đặt hợp đồng mã Microsoft.

Bạn có thể tải Microsoft Mã Hợp đồng từ Microsoft Research: http://research.microsoft.com/en-us/projects/contracts/

Bây giờ trên các thuộc tính dự án của bạn, bạn sẽ nhận được một tab phụ nơi bạn có thể thiết lập thời gian chạy và kiểm tra tĩnh.

+0

vui lòng tham khảo thông tin này để biết thêm chi tiết https://www.develop.com/csharpcodecontracts – Joseph

+0

Joseph, tôi đã cài đặt Hợp đồng Mã đúng cách. Như bạn có thể thấy trong câu hỏi của tôi, các Hợp đồng Mã làm việc nói chung và không hoạt động trong trường hợp cụ thể được đề cập ở trên. – vlow

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