Tiện lợi?
Ít hoặc nhiều, có. Hãy xem xét trường hợp khi bạn có đối tượng giống như số (ví dụ: Complex
) mà bạn tính toán. Rõ ràng, viết mã như:
Complex result = c1 * new Complex(2) + new Complex(32);
rất khó đọc và khó đọc. Chuyển đổi ngầm định giúp đỡ ở đây (một thay thế sẽ là quá tải của toán tử trong ví dụ này, nhưng điều đó sẽ dẫn đến nhiều sự quá tải tương tự).
Có hướng dẫn về điều này không?
Cung cấp ít chuyển đổi tiềm ẩn nhất có thể, vì chúng có thể ẩn sự cố. Chuyển đổi ngầm định làm giảm bớt sự chứng kiến bằng cùng một số tiền mà chúng làm tăng sự tẻ nhạt. Đôi khi điều này là tốt, nhưng đôi khi không.
tôi thấy nó tốt nhất để hạn chế chuyển đổi ngầm để rất loại tương tự, chẳng hạn như các đối tượng số giống như trong ví dụ của tôi ở trên: một int
về bản chất là-một Complex
(từ quan điểm toán học, thậm chí nếu nó không được mô phỏng qua thừa kế), do đó một chuyển đổi tiềm ẩn có ý nghĩa.
Trong VB, chuyển đổi tiềm ẩn được gọi là “Widening
” (ngược với Narrowing
, là explicit
) và điều này mô tả tốt: không có thông tin nào bị mất trong quá trình chuyển đổi. Hơn nữa, một toán tử về cơ bản là một hàm xây dựng, và có một số lợi thế thông thường của hàm xây dựng trên một hàm tạo: cụ thể là nó có thể sử dụng lại các giá trị được lưu trong bộ nhớ đệm thay vì luôn tạo các phiên bản mới.
Hãy xem xét ví dụ Complex
của tôi. Chúng tôi có thể muốn lưu các giá trị bộ nhớ cache cho các số phức thường được sử dụng:
Class Complex {
// Rest of implementation.
private static Complex[] cache = new[] {
new Complex(-1), new Complex(0), new Complex(1) };
public implicit operator Complex(int value) {
if (value >= -1 && value <= 1)
return cache[value];
else
return new Complex(value);
}
}
Tất nhiên, việc tối ưu hóa vi mô này có hiệu quả hay không là một câu hỏi khác.
Cảm ơn, bạn sẽ làm thế nào để quá tải nhà điều hành có thể giúp loại phức hợp? Bạn cần chỉnh sửa kiểu int, đúng không? –
@Janan: Không, vì bạn có thể triển khai toán tử theo cả hai hướng: * từ * loại tùy chỉnh của bạn và * thành * loại tùy chỉnh của bạn. Trong ví dụ của tôi, chỉ đơn giản là có 'Complex' thực hiện một toán tử' implicit operator Complex (int value) '. –
Cảm ơn tôi nhận được nó ngay bây giờ. –