2013-11-05 34 views
0

使用虛擬關鍵字:至於因爲我見過人們使用虛擬關鍵字財產這樣的屬性

public class Client 
{ 
    public virtual int? Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Lastname { get; set; } 
    public virtual int? Age { get; set; } 
    public virtual ISet<Login> Logins { get; set; } 
} 

我們都知道,當我們宣佈任何虛擬的是,在派生類中,我們可以將其覆蓋,但是在屬性上使用這個關鍵字是否也有其他原因?

如果你可以用一個例子來解釋它,它可能會清除一切。

+0

看起來像NHibernate的POCO類。 NHibernate在這些POCO之上構建了一個代理類,以方便延遲加載,所以它需要'virtual'屬性... –

回答

2

就像Patryk說的那樣,它能夠使用像NHibernate或Entity Framework這樣的ORM順暢地工作。然後,這個ORM在聲明爲虛擬的屬性之上構建代理類,以便對它們進行延遲加載(獲取所有導航數據)。

例子:

public class User 
{ 
    public int ID { get; set; } 
    public virtual Role Role { get; set; } 
} 
public class Role 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual List<User> UsersInRole { get; set; } 
} 

當你得到一個用戶,您將自動獲得相關的角色。如果您獲得角色,您將自動獲取該角色中的所有用戶。

Docs of Entity Framework:http://msdn.microsoft.com/en-us/data/jj679962

+0

你說: - 這個ORM然後在聲明爲虛擬的屬性之上構建代理類,以啓用它們的延遲加載。你可以將plzz重定向到一些文章,這些文章展示了虛擬關鍵字如何幫助實現延遲加載。謝謝 – Mou

+0

取決於你想使用哪個ORM。我個人更喜歡實體框架。 http://msdn.microsoft.com/en-us/data/ee712907#codefirst這裏是永恆的基本開始與EF。我始終遵循「守則優先」對我的關係進行最大程度的控制。 https://github.com/stefchri/ArticulatieOnderzoek這是一個實施了這個項目。 –

3

正因如此,他們使用virtual關鍵字:允許派生類覆蓋行爲。屬性的行爲也可以被重寫。僅僅因爲這個基類使用自動屬性並不意味着所有的派生類都必須這樣做。

public class IdCheckingClient : Client 
{ 
    private int? backingfieldId; 

    public override int? Id 
    { 
     get { return backingfieldId; } 
     set 
     { 
      if(value.HasValue && value.Value < 0) 
      { 
       throw new ArgumentException("ID needs to be positive or null"); 
      } 
      backingfieldId = value; 
     } 
    } 
} 
+0

我知道使用virtual關鍵字並覆蓋relatiob,但我想知道virtual關鍵字如何實現延遲加載。如果可能的話,詳細指導我。謝謝 – Mou