Tại nguy cơ bị xuống bình chọn, bạn có thể muốn viết phương pháp giá trị tuyệt đối của riêng bạn, tùy thuộc về những gì bạn đang sử dụng. Đoạn mã sau đây (xin lỗi nó trong C#, nhưng cùng một nguyên tắc áp dụng):
short i = -32768;
int iAbs = Math.Abs(i);
hạnh phúc sẽ biên dịch, nhưng khi chạy, dòng thứ hai sẽ ném một OverflowException với thông điệp hữu ích "Làm giảm giá trị nhỏ nhất của một số bổ sung twos không hợp lệ. " Trong trường hợp này, bởi vì tôi là loại ngắn, trình biên dịch chọn quá tải Math.Abs chấp nhận một đoạn ngắn và trả về một đoạn ngắn, và +32768 không phải là một giá trị hợp lệ, vì vậy phương thức ném ngoại lệ ngay cả khi bạn nghĩ bạn đang dự đoán vấn đề này bằng cách làm cho iAbs một int.
đoạn này:
short i = -32768;
int iAbs = Math.Abs((int)i);
sẽ biên dịch và thực thi mà không một ngoại lệ, nhưng đó là loại clunky mã theo cách này. Theo tôi, đây là một lỗi rất lén lút bởi vì nó rất hiếm khi gặp phải trong thế giới thực (vì chỉ có một giá trị cho mỗi loại sẽ tạo ra ngoại lệ này). Thật không may, tôi gặp phải lỗi này bất cứ khi nào tôi sử dụng Math.Abs để chuẩn hóa dữ liệu âm thanh (thường là mảng ngắn []), vì vậy tôi đã có thói quen viết trình bao bọc riêng của mình xung quanh Math.Abs xử lý tất cả điều này cho tôi và chỉ trả về một đôi:
public double AbsThatDoesntSuck(short value)
{
return Math.Abs((double)value);
}
với quá tải cho bất kỳ loại nào khác mà tôi cần xử lý. Tôi hiểu tại sao Math.Abs được viết để hành xử theo cách này, nhưng nó chắc chắn có thể cắn phía sau của những người không biết.
Thats dễ dàng, cảm ơn! – Cyclone
Vâng, ít nhất là liên kết MSDN có các liên kết con đề cập đến vấn đề tràn tiềm năng, ngay cả khi không ai có thể nghĩ đến việc thực sự nhấp vào chúng. – MusiGenesis
Nhân tiện, tôi nghĩ bạn nên được cấp 20K tiền thưởng danh tiếng ngay lập tức cho công việc của bạn trên The Daily WTF. – MusiGenesis