2012-01-11 13 views
6

Theo định nghĩa các thuộc tính hoặc phương thức ảo là các phương thức hiển thị cho các lớp con được ghi đè. Nhưng, NHibernate ví dụ sử dụng các thuộc tính ảo để đảm bảo tải chậm.thuộc tính ảo và tải chậm

Câu hỏi của tôi không phải về NHibernate, nhưng làm thế nào bạn có thể sử dụng các thuộc tính ảo để đạt được tải chậm? Có bất kỳ hành vi ẩn nào về các thuộc tính ảo mà tôi không biết không?

Trả lời

9

Thực tế là chúng được khai báo ảo cho phép NHibernate ghi đè thuộc tính và tạo proxy thực hiện cho nó - proxy lần lượt chúng có thể sử dụng để thực hiện tải chậm trên quyền truy cập đầu tiên của thuộc tính.

+0

Nhibernate kế thừa lớp học của bạn? –

+0

Vâng, đó là lý do tại sao nó cần 'ảo'. Bằng cách này, nó có thể thay thế thuộc tính của bạn bằng mã để tìm nạp dữ liệu khi được truy cập. – ChrisAnnODell

+0

@ChrisAnnODell làm thế nào một lớp có thể được thừa kế tại thời gian chạy? Không có cách nào để đạt được điều này bằng cách phản ánh –

2

Không có hành vi ẩn nào sau virtual thành viên. Ngoại trừ thực tế không được che giấu đến mức chúng có thể bị ghi đè trong các lớp trẻ em.

Có thể đạt được tải chậm bằng cách sử dụng lớp Lazy<T>. Trong đó T là loại sẽ được tải. Nó sẽ chuyển đổi hoàn toàn thành T.

Hoặc nếu bạn muốn tự thiết lập các thuộc cư xử lười biếng bạn có thể sử dụng một cái gì đó như thế này:

private SomeType _someProperty = null; 
public override SomeType SomeProperty 
{ 
    get 
    { 
     if (_someProperty == null) 
     { 
      // Load _someProperty 
     } 
     return _someProperty; 
    } 
} 

Với ValueTypes bạn có thể chọn để làm cho họ Nullable<T>. Hoặc giới thiệu bool cho dù chúng được tải hay không.

+0

Nếu anh ta không có quyền truy cập vào Lazy thì sao? Và làm thế nào người ta có thể đạt được sự lười biếng với ảo/ghi đè? Tôi nghĩ điều này có ý nghĩa gì. – oleksii

+0

Sự lười biếng thủ công. Hãy để tôi xác định điều đó. – Aidiakapi