2010-07-10 28 views
10

Tôi có một hàm chấp nhận tham số có tên IV. Có anyway mà tôi có thể xác định rõ ràng kích thước của tham số IV là 16?Làm thế nào để xác định rõ kích thước của tham số mảng được chuyển đến hàm

public AESCBC(byte[] key, byte[16] inputIV) 
{ 

    //blah blah 

} 

Ở trên tất nhiên là không hiệu quả. Có thể không? Tôi biết tôi có thể kiểm tra nó bên trong chức năng và ném một ngoại lệ nhưng nó có thể được định nghĩa trong định nghĩa chức năng?

+3

Bạn sẽ phải tạo một lớp tùy chỉnh cho điều đó. –

Trả lời

17

Bạn không thể, về cơ bản. Như Jaroslav nói, bạn có thể tạo ra loại của riêng bạn - nhưng khác hơn thế, bạn đang mắc kẹt với việc chỉ ném một ngoại lệ.

Với Code Contracts bạn có thể thể hiện điều này trong một hình thức mà kiểm tra tĩnh có thể giúp với:

Contract.Requires(inputIV.Length == 16); 

Sau đó, kiểm tra tĩnh có thể cho bạn biết lúc xây dựng thời gian nếu nó nghĩ rằng bạn có thể đã vi phạm hợp đồng. Điều này chỉ có sẵn với các phiên bản cao cấp và Ultimate của Visual Studio mặc dù.

(Bạn vẫn có thể sử dụng Mã Hợp đồng mà không có sự kiểm tra tĩnh với VS Professional, nhưng bạn sẽ không nhận được hợp đồng.)

cắm: Hiện nay Bộ luật Hợp đồng chương từ C# in Depth 2nd edition có sẵn miễn phí để tải về, nếu bạn muốn biết thêm thông tin.

+0

Jon - Tôi vừa mua cuốn sách của bạn và tôi phải nói rằng tôi chưa bao giờ đạt được nhiều kiến ​​thức với giá 30 đô la. Tôi đã đặt hàng trước phiên bản thứ 2. Công cụ tuyệt vời! – Marko

+1

Lưu ý: bạn cần xác định biểu tượng biên dịch 'CONTRACTS_FULL' (nếu chưa được xác định), nếu không' Contract.Requires' sẽ không được biên dịch. –

+1

@Marko: Cảm ơn, đó là một sự chứng thực đáng yêu :) @Jaroslav: Vâng, nếu bạn định sử dụng Code Contracts một cách hiệu quả, bạn thực sự cần tải xuống những công cụ giúp bạn dễ dàng thực hiện việc này. –

5

Bạn không thể chỉ định kích thước tham số mảng trong khai báo phương thức, như bạn đã phát hiện. Điều tốt nhất tiếp theo là kiểm tra kích thước và ném ngoại lệ:

public AESCBC(byte[] key, byte[] inputIV) 
{ 
    if(inputIV.Length() != 16) 
     throw new ArgumentException("inputIV should be byte[16]"); 

    //blah blah 

} 

Một tùy chọn khác để tạo lớp học kết thúc tốt đẹp byte[16] và chuyển qua đó.

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