Tôi có một đối tượng với các thuộc tính được hiển thị là List<>
. Tôi thường khởi tạo danh sách của tôi trong getter tài sản như sau:Khởi tạo danh sách bên trong các thuộc tính so với trong hàm tạo?
public class Foo
{
private List<bar> _barList;
public List<bar>
{
get
{
if(_barList == null)
{
_barList = new List<Bar>()
}
return _barList;
}
set
{
_barList = value;
}
}
public Foo()
{
}
}
Tuy nhiên, đồng nghiệp của tôi thường thích khởi tạo danh sách trong constructor lớp như sau:
public class Foo
{
public List<bar> BarList { get; set; }
public Foo()
{
BarList = new List<Bar>();
}
}
Cả hai trường hợp ngăn chặn BarList
khỏi bị truy cập trước nó được khởi tạo. Thứ hai có vẻ gọn gàng hơn do việc sử dụng autoproperties. Đầu tiên có vẻ như là một lựa chọn tốt hơn, vì danh sách chỉ được khởi tạo khi nó được sử dụng lần đầu tiên. Có cân nhắc nào khác mà tôi nên tính đến không? Có cách nào tốt nhất cho việc này không?
Điều quan trọng là đảm bảo tính hợp lệ của trạng thái lớp học của bạn. Cả hai cách tiếp cận này mang lại kết quả tương tự bên ngoài, nhưng bên trong '_barList' được khởi tạo lười biếng của bạn có thể là null trong khi hàm khởi tạo khởi tạo' BarList' sẽ không rỗng khi ai đó cố gắng sử dụng nó trong lớp. Vâng, bên ngoài kết quả không hoàn toàn giống nhau nếu bạn bắt đầu giới thiệu các hành vi đa luồng vào phương trình. –
Phương pháp "tải háo hức" và "tải chậm" thực sự. –
Trong trường hợp này, về cơ bản là một câu hỏi về phong cách (và ý kiến, mặc dù). Trong C# 6.0, bạn có một cách khác để khởi tạo thuộc tính được tự động triển khai, vì [this SO answer] (http://stackoverflow.com/a/40754/1389444) hiển thị. –