Tôi muốn hạn chế giá trị của tham số số trong một hàm tạo trong phạm vi nhất định.Giới hạn giá trị của tham số trong một hàm tạo AT THIẾT KẾ THỜI GIAN
Tôi biết các cách thông thường là để làm một cái gì đó như sau:
public class Foo
{
public int MaxAmount { get; }
public int Amount { get; set; }
public Foo(int amount)
{
if (amount > MaxAmount) { Amount = MaxAmount; }
else if (amount < 1) { Amount = 1; }
else { Amount = amount; }
}
}
Nhưng những gì tôi không thích về việc này là người gọi không biết khi nào tài sản được thiết lập để một cái gì đó khác hơn những gì đã được chỉ định. Tôi có thể trả lại một ngoại lệ thay vì âm thầm kẹp giá trị, nhưng đó không phải là rất thân thiện.
Những gì tôi muốn là một cái gì đó tương tự như thế này:
public Foo(int(1, this.MaxAmount) amount) // Where int(minimumValue, maximumValue)
{
Amount = amount;
}
trong đó người ta sẽ thậm chí không có khả năng nhanh chóng Foo với một giá trị không thể chấp nhận - khuôn khổ sẽ ngăn chặn nó.
Có điều gì giống như vậy không?
EDIT cho rõ ràng:
Những gì tôi đang theo đuổi là một phương tiện mà các tham số tự có thể mang và truyền đạt thông tin về những hạn chế của nó - trong một 'nướng trong' thời trang mà có thể, ví dụ, bề mặt trong Intellisense khi bạn viết cuộc gọi. Vì vậy, tôi muốn tránh các công việc của thậm chí cố gắng để nhanh chóng lớp nếu các giá trị cho các tham số không hợp lệ.
Nếu, ví dụ, chương trình đang chạy và người dùng nhập số (N) và nhấn nút tạo Foo mới với số lượng N bất hợp pháp, bây giờ tôi có ngoại lệ để xử lý và một cái gì đó để gỡ lỗi và sửa chữa. Tại sao thậm chí cho phép nó ở nơi đầu tiên? Nếu Foo được định nghĩa rõ ràng là có đường biên trên của thuộc tính Số lượng, thì điểm cho phép nhà phát triển viết Foo (5) khi tôi có thể thông báo cho anh ta rằng giá trị anh ta chuyển không hợp lệ vào thời điểm anh ta viết nó?
Nếu có một số cú pháp đường, như ParameterConstraint hoặc một cái gì đó, được xử lý bởi khung cho tôi để tôi không phải cuộn của riêng tôi vào mỗi lớp tôi viết, tôi nghĩ rằng sẽ rất hữu ích.
Lưu ý rằng việc sử dụng 'Contract.Requires' là không đủ. Bạn vẫn cần một 'if (...) ném mới ArgumentOutOfRangeException()'. –