Tôi đang đùa giỡn với ý tưởng tạo các kiểu giá trị .NET nguyên thủy hơn loại an toàn hơn và nhiều hơn nữa "tự tạo tài liệu" bằng cách gói chúng trong tùy chỉnh struct
s. Tuy nhiên, tôi tự hỏi nếu nó thực sự có giá trị nỗ lực trong phần mềm thế giới thực.Loại giá trị .NET nguyên thủy chống kiểu thông qua các cấu trúc tùy chỉnh: Có đáng để nỗ lực không?
(Đó là "nỗ lực" có thể được nhìn thấy dưới đây:. Phải áp dụng các mẫu mã tương tự một lần nữa và một lần nữa Chúng tôi tuyên bố
struct
s và do đó không thể sử dụng thừa kế để loại bỏ mã lặp lại, và kể từ khi các nhà khai thác quá tải phải được khai báostatic
, họ phải được xác định đối với từng loại riêng biệt)
Đi này (phải thừa nhận là tầm thường) ví dụ:.
struct Area
{
public static implicit operator Area(double x) { return new Area(x); }
public static implicit operator double(Area area) { return area.x; }
private Area(double x) { this.x = x; }
private readonly double x;
}
struct Length
{
public static implicit operator Length(double x) { return new Length(x); }
public static implicit operator double(Length length) { return length.x; }
private Length(double x) { this.x = x; }
private readonly double x;
}
Cả hai Area
và Length
về cơ bản là double
, nhưng làm tăng thêm với ý nghĩa cụ thể. Nếu bạn đã xác định một phương thức như & hellip;
Area CalculateAreaOfRectangleWith(Length width, Length height)
& hellip; không may không thể trực tiếp vượt qua trong tình huống Area
. Càng xa càng tốt.
NHƯNG: Bạn có thể dễ dàng tránh né rõ ràng cải thiện an toàn kiểu này đơn giản bằng cách đúc một Area
-double
, hoặc bằng cách tạm thời lưu trữ một Area
trong một biến double
, và sau đó đi qua đó vào phương pháp mà một Length
dự kiến:
Area a = 10.0;
double aWithEvilPowers = a;
… = CalculateAreaOfRectangleWith((double)a, aWithEvilPowers);
Câu hỏi: có ai ở đây có kinh nghiệm với việc sử dụng rộng rãi của tùy chỉnh như struct
loại trong thực tế/phần mềm sản xuất? Nếu vậy:
đã bọc của kiểu giá trị nguyên thủy trong tùy chỉnh
struct
s bao giờ trực tiếp dẫn đến lỗi ít hơn, hoặc trong mã dễ bảo trì hơn, hoặc đưa ra bất kỳ lợi thế lớn khác (s)?Hoặc các lợi ích của tùy chỉnh
struct
là quá nhỏ để chúng có thể được sử dụng trong thực tế?
P.S .: Khoảng 5 năm đã trôi qua kể từ khi tôi hỏi câu hỏi này. Tôi đang đăng some of my experiences that I've made since then làm câu trả lời riêng.
** P.S.: ** Tôi biết rằng người ta có thể loại bỏ một trong hai kỹ thuật sideste được mô tả bằng cách xác định toán tử 'Area -> double' thay vì' implicit'. – stakx
Tôi có lẽ không nghĩ đủ lớn, nhưng bạn có thấy rằng loại lỗi này xuất hiện rất thường xuyên cho bạn? Đó là - một khi bạn có dữ liệu của bạn từ nguồn bên ngoài (có lẽ không được phân loại) và vào chương trình của bạn, nó sẽ ở trong một cấu trúc nào đó mà nó được truy cập bởi một số tên có ý nghĩa như "object.length". Bạn thường không kết thúc việc đi qua những con số thô, mà đúng hơn là bạn đi qua các cấu trúc. Tôi nghĩ loại lỗi này rất hiếm, tôi không thể nghĩ đến nó. –
Tôi nghi ngờ loại lỗi này không xảy ra thường xuyên với tôi, @jamietre, nhưng tôi chưa có bất kỳ thống kê cứng nào để hỗ trợ hoặc bác bỏ giả định đó. Tuy nhiên, có những lợi ích tiềm năng khác; mã dễ hiểu hơn có thể là một trong số đó. Tôi chỉ không chắc chắn lên phía trước nếu điều đó biện minh cho việc phải thực hiện rất nhiều loại 'struct' tương tự nhau ... – stakx