C#遅延ロード
序文
レイジーは、実際に通話がその遅延(遅延ロード)の利益を初期化するために作成される後まで延期するオブジェクトを作成し、オンデマンドでロードされたオブジェクトをロードすると、システムのパフォーマンスを向上させ、不必要な計算と資源の不必要な浪費を避けるためです。
従来、これらの状況:
- オブジェクトは、高いコストを作成し、プログラムはそれを使用しない場合があります。例えば、Customerオブジェクトを有するメモリ特性注文があると仮定し、物体が注文多数のオブジェクトが含まれ、これらのオブジェクトは、データベース接続を初期化する必要があります。ユーザーが注文の計算にデータを表示したり、使用する必要はありませんされている場合、それはシステムメモリや計算サイクルを使用して作成する必要はありません。オブジェクトが遅い初期化するために使用されている受注を宣言するレイジーを使用することにより、オブジェクトは、システムリソースの浪費を使用せずに回避することができます。
- オブジェクトの作成費用、そしてあなたは、高コストオペレーションを作成するために、他の後まで延期することにしたい完了です。例えば、その起動時にオブジェクト・インスタンスのプログラム・ロードの複数が、ローディングの一部のみ直ちに仮定する。プログラムの起動時のパフォーマンスを向上させるために必要なオブジェクトを作成するまで不要なオブジェクトを初期化することによって延期。(公式情報源)
例
ユーザークラスを作成します。
public class User
{
public string Name { get; set; } public int Age { get; set; } public User() { this.Name = "Name"; this.Age = 0; } }
デフォルトでは、レイジーオブジェクトは、スレッドセーフです。コンストラクタはセキュリティスレッドのタイプを指定しない場合つまり、レイジーは、この関数はスレッドセーフを作成するオブジェクト。マルチスレッドのシナリオでは、オブジェクトのValueプロパティにアクセスするための最初のスレッドは、すべてのスレッド上での初期化へのすべての後続のアクセスのためのスレッドセーフレイジーとなり、すべてのスレッドが同じデータを共有します。したがって、競合状態が良性である、オブジェクトを初期化したスレッド重要ではありません。
class Program
{
static void Main(string[] args) { Lazy<User> user = new Lazy<User>(); ThreadLocal<User> threadLocal = new ThreadLocal<User>(); if (!user.IsValueCreated) Console.WriteLine("The object is not initialized"); Console.WriteLine(user.Value.Name); user.Value.Name = "Name1"; user.Value.Age = 1; Console.WriteLine(user.Value.Name); Console.Read(); } }
スレッドセーフオブジェクト | LazyThreadSafetyModeモードパラメータ | ブール型パラメータでisThreadSafe | いいえスレッドの安全性パラメータはありません |
---|---|---|---|
完全にスレッドセーフで1つだけのスレッドが値を初期化しようとします。 | ExecutionAndPublication | 真 | ことができます。 |
非スレッドセーフ。 | なし | 偽 | 該当事項はありません。 |
完全にスレッドセーフ;初期値のためのスレッドの競合。 | PublicationOnly | 該当事項はありません。 | 該当事項はありません。 |
ブール型はどのIsValueCreated財産である、我々は現在のオブジェクトが初期化されていないかを決定するために、このプロパティを使用することができます
コールの後、作成をしました
私は怠惰ないくつかのコンストラクタをしましょう、
-
レイジーパブリック(BOOLでisThreadSafe) :
でisThreadSafeブールパラメータ、Valueプロパティは、複数のスレッドからアクセスされているかどうかを指定するために使用されるパラメータ。あなたが唯一のスレッドからプロパティにアクセスしたい場合は、入ってくる偽のは控えめなパフォーマンス上の利点を得ることができます。あなたが複数のスレッドからのプロパティにアクセスしたい場合は、入ってくる真は正しく競合状態を処理するために、レイジーインスタンスを示すために、(1つのスレッドが初期化時に例外がスローされます)。 -
レイジーパブリック(LazyThreadSafetyMode MODE)は:スレッドセーフモードを提供します。
-
レイジーパブリック(機能ValueFactoryの):
ラムダ式は、コンストラクタnewレイジーオブジェクトに渡されます。次回のアクセスは、Valueプロパティは新しいレイジーとそのValueプロパティの初期化は、その後、新しい値がプロパティに割り当てられているが返されますが発生します。
概要
参考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization
序文
レイジーは、実際に通話がその遅延(遅延ロード)の利益を初期化するために作成される後まで延期するオブジェクトを作成し、オンデマンドでロードされたオブジェクトをロードすると、システムのパフォーマンスを向上させ、不必要な計算と資源の不必要な浪費を避けるためです。
従来、これらの状況:
- オブジェクトは、高いコストを作成し、プログラムはそれを使用しない場合があります。例えば、Customerオブジェクトを有するメモリ特性注文があると仮定し、物体が注文多数のオブジェクトが含まれ、これらのオブジェクトは、データベース接続を初期化する必要があります。ユーザーが注文の計算にデータを表示したり、使用する必要はありませんされている場合、それはシステムメモリや計算サイクルを使用して作成する必要はありません。オブジェクトが遅い初期化するために使用されている受注を宣言するレイジーを使用することにより、オブジェクトは、システムリソースの浪費を使用せずに回避することができます。
- オブジェクトの作成費用、そしてあなたは、高コストオペレーションを作成するために、他の後まで延期することにしたい完了です。例えば、その起動時にオブジェクト・インスタンスのプログラム・ロードの複数が、ローディングの一部のみ直ちに仮定する。プログラムの起動時のパフォーマンスを向上させるために必要なオブジェクトを作成するまで不要なオブジェクトを初期化することによって延期。(公式情報源)
例
ユーザークラスを作成します。
public class User
{
public string Name { get; set; } public int Age { get; set; } public User() { this.Name = "Name"; this.Age = 0; } }
デフォルトでは、レイジーオブジェクトは、スレッドセーフです。コンストラクタはセキュリティスレッドのタイプを指定しない場合つまり、レイジーは、この関数はスレッドセーフを作成するオブジェクト。マルチスレッドのシナリオでは、オブジェクトのValueプロパティにアクセスするための最初のスレッドは、すべてのスレッド上での初期化へのすべての後続のアクセスのためのスレッドセーフレイジーとなり、すべてのスレッドが同じデータを共有します。したがって、競合状態が良性である、オブジェクトを初期化したスレッド重要ではありません。
class Program
{
static void Main(string[] args) { Lazy<User> user = new Lazy<User>(); ThreadLocal<User> threadLocal = new ThreadLocal<User>(); if (!user.IsValueCreated) Console.WriteLine("The object is not initialized"); Console.WriteLine(user.Value.Name); user.Value.Name = "Name1"; user.Value.Age = 1; Console.WriteLine(user.Value.Name); Console.Read(); } }
スレッドセーフオブジェクト | LazyThreadSafetyModeモードパラメータ | ブール型パラメータでisThreadSafe | いいえスレッドの安全性パラメータはありません |
---|---|---|---|
完全にスレッドセーフで1つだけのスレッドが値を初期化しようとします。 | ExecutionAndPublication | 真 | ことができます。 |
非スレッドセーフ。 | なし | 偽 | 該当事項はありません。 |
完全にスレッドセーフ;初期値のためのスレッドの競合。 | PublicationOnly | 該当事項はありません。 | 該当事項はありません。 |
ブール型はどのIsValueCreated財産である、我々は現在のオブジェクトが初期化されていないかを決定するために、このプロパティを使用することができます
コールの後、作成をしました
私は怠惰ないくつかのコンストラクタをしましょう、
-
public Lazy (bool isThreadSafe):
isThreadSafe 的布尔参数,该方法参数用于指定是否从多线程访问 Value 属性。 如果想要仅从一个线程访问属性,则传入 false 以获取适度的性能优势。 如果想要从多线程访问属性,则传入 true 以指示 Lazy 实例正确处理争用条件(初始化时一个线程引发异常)。 -
public Lazy (LazyThreadSafetyMode mode):提供线程安全模式。
-
public Lazy (Func valueFactory):
lambda 表达式传递给新的 Lazy 对象的构造函数。 下一次访问 Value 属性将导致新 Lazy 的初始化,并且其 Value 属性此后会返回已分配给该属性的新值。
总结
参考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization