Tôi có một thói quen kỳ lạ dường như ... ít nhất là theo đồng nghiệp của tôi. Chúng tôi đã cùng nhau thực hiện một dự án nhỏ. Cách tôi viết các lớp là (ví dụ đơn giản hóa):
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
Vì vậy, về cơ bản, tôi chỉ khởi tạo bất kỳ trường nào khi một getter được gọi và trường vẫn là null. Tôi hình dung điều này sẽ giảm quá tải bằng cách không khởi tạo bất kỳ thuộc tính nào không được sử dụng ở bất cứ đâu.
ETA: Lý do tôi đã làm điều này là vì lớp của tôi có một số thuộc tính trả về một thể hiện của một lớp khác, do đó cũng có các thuộc tính với nhiều lớp hơn, v.v. Gọi hàm tạo cho lớp trên cùng sau đó sẽ gọi tất cả các hàm tạo cho tất cả các lớp này, khi chúng không phải lúc nào cũng cần thiết.
Có bất kỳ phản đối chống lại thực hành này, ngoài sở thích cá nhân?
CẬP NHẬT: Tôi đã xem xét nhiều ý kiến khác nhau liên quan đến câu hỏi này và tôi sẽ đứng trước câu trả lời được chấp nhận của tôi. Tuy nhiên, bây giờ tôi đã hiểu rõ hơn về khái niệm này và tôi có thể quyết định khi nào nên sử dụng nó và khi nào thì không.
Nhược điểm:
- Vấn đề an toàn chủ đề
- Không tuân theo yêu cầu "setter" khi giá trị được truyền là null
- Tối ưu hóa vi mô
- Xử lý ngoại lệ nên diễn ra trong một nhà xây dựng
- Cần kiểm tra null trong mã của lớp
Ưu điểm:
- Tối ưu hóa vi mô
- Thuộc tính không bao giờ trả về null
- Trì hoãn hoặc tránh tải các đối tượng "nặng"
Hầu hết các nhược điểm không thể áp dụng cho thư viện hiện tại của tôi, tuy nhiên tôi sẽ phải kiểm tra xem liệu "tối ưu hóa vi mô" có thực sự tối ưu hóa bất cứ điều gì không.
CẬP NHẬT CUỐI CÙNG:
Được rồi, tôi đã thay đổi câu trả lời của tôi. Câu hỏi ban đầu của tôi là liệu đây có phải là một thói quen tốt hay không. Và bây giờ tôi tin chắc rằng không phải vậy. Có thể tôi vẫn sẽ sử dụng nó trong một số phần của mã hiện tại của mình, nhưng không phải vô điều kiện và chắc chắn không phải lúc nào cũng vậy. Vì vậy, tôi sẽ mất thói quen và suy nghĩ về nó trước khi sử dụng nó. Cảm ơn mọi người!