2012-01-31 28 views
5

tôi đang tìm kiếm thông qua một số mã hôm nay và thấy một cái gì đó như sau:Tại sao Windows Forms Designer cast int thành byte sau đó quay lại int cho FromArgb?

var colour = Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(213)))), ((int)(((byte)(193))))); 

Khi tôi hỏi tại sao lại như vậy, kể từ Resharper khẳng định rằng tất cả các diễn viên là không cần thiết, tôi đã nói rằng các nhà thiết kế thực hiện nó mà và họ đã sao chép nó.

Tôi đã xem và đảm bảo rằng Nhà thiết kế tạo mã giống như trên khi thiết lập thuộc tính thành màu tùy chỉnh.

Có ai biết tại sao Nhà thiết kế sẽ làm điều này không? Nó không có vẻ có ý nghĩa trên khuôn mặt của nó, trừ khi tôi đang thiếu một cái gì đó?

+3

Bạn có thể đang bỏ lỡ câu chuyện hạnh phúc ở đây. Miễn là máy viết mã như thế này, bạn sẽ nhận được công việc của bạn trong một thời gian. –

Trả lời

9

Mã này được tự động tạo bởi trình tuần tự mã được tích hợp vào trình thiết kế Winforms. Bên có tội ở đây là lớp System.Drawing.ColorConverter, TypeConverter cho màu. Mã có liên quan trong phương thức ConvertTo() của nó là:

member = typeof(Color).GetMethod("FromArgb", new Type[] { typeof(int), typeof(int), typeof(int) }); 
    arguments = new object[] { color2.R, color2.G, color2.B }; 

Thuộc tính R, G và B trả về một byte. Vì vậy, bộ mã tuần tự đầu tiên tạo ra các chữ số nguyên và áp dụng (byte) đúc để phù hợp với loại đối số. Sau đó, thấy rằng FromArgb() chấp nhận các đối số nguyên, do đó, áp dụng phép đúc (int).

Đây chỉ là mã được tạo bằng máy điên cuồng. Nó chỉ phải đúng, nó không phải là đẹp.

+1

Đây là những gì tôi đã sau, một lời giải thích về lý do tại sao các nhà thiết kế tạo ra mã như thế này ở nơi đầu tiên. – Glenn

5

Không có lợi ích. Tất cả những gì nó làm là làm cho mã khó đọc.

Đây là một lợi thế

var colour = Color.FromArgb(227, 213, 193); 

hoặc ngay cả những phiên bản alpha channel:

var colour = Color.FromArgb(255, 227, 213, 193); 

Như @Alexei Levenkov chỉ ra, có lẽ tác giả đã thận trọng, nhưng được đặt tên rõ ràng của phương pháp này và sử dụng dự định của nó (nổi tiếng), tại sao bất kỳ ai sử dụng giá trị lớn hơn 255 cho bất kỳ tham số nào?

Ref. Color.FromArgb Method

+0

+1. Đầu tiên cast thành byte có thể được sử dụng để cắt bớt các giá trị (nếu các giá trị không phải là hằng số), nhưng tôi không thể thấy bất kỳ lý do nào cho phép diễn xuất thứ hai. –

+0

Bạn dường như nghĩ rằng mã này được viết bởi một con người. Nó không được, mã thiết kế Winforms được viết bởi một máy tính. Nó chỉ có để biên dịch, được khá không phải là một yêu cầu. –

+1

@Hans: khi tôi đọc câu hỏi "Tôi đã nói rằng nhà thiết kế đã thực hiện theo cách đó" làm cho nó có vẻ như 'một' nhà thiết kế, không phải 'nhà thiết kế'! Tôi biết nhà thiết kế Winforms là gì. –

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