仮想 ICollectionが EF で遅延読み込みを有効にする理由に関する質問に答えるには、C#でのvirtualキーワードの定義と意味が必要です。MSDNから:
The virtual keyword is used to modify a method, property, indexer or event declaration,
and allow it to be overridden in a derived class. For example, this method can be
overridden by any class that inherits it.
これは、オブジェクト指向プログラミングの概念からの継承メカニズムの一部です。
サブクラスが基本クラスとして別の (拡張された) 機能を必要とすることはよくあります。そのような場合、virtualキーワードを使用すると、プログラマはオーバーライドできます(必要に応じて、この現在の実装の基本クラスのデフォルトの実装ですが、他のすべての事前定義されたメソッド/プロパティ/その他は引き続き基本クラスから取得されます!
簡単な例は次のとおりです。
// base digit class
public class Digit
{
public int N { get; set; }
// default output
public virtual string Print()
{
return string.Format("I am base digit: {0}", this.N);
}
}
public class One : Digit
{
public One()
{
this.N = 1;
}
// i want my own output
public override string Print()
{
return string.Format("{0}", this.N);
}
}
public class Two : Digit
{
public Two()
{
this.N = 2;
}
// i will use the default output!
}
2 つのオブジェクトが作成され、Printが呼び出された場合:
var one = new One();
var two = new Two();
System.Console.WriteLine(one.Print());
System.Console.WriteLine(two.Print());
出力は次のとおりです。
1
I am base digit: 2
EF での遅延評価は、virtualキーワード direct からではなく、キーワードが有効にするオーバーライドの可能性から発生します (再びMSDN on Lazy Loading から)。
When using POCO entity types, lazy loading is achieved by creating
instances of derived proxy types and then overriding virtual
properties to add the loading hook.
定義済みのメソッドがオーバーライドされると、プログラマーは遅延読み込みを有効にすることができます!