Freigeben über


So geht's: Lazy-Initialisierung von Objekten durchführen

Die System.Lazy<T> Klasse vereinfacht die Ausführung der faulen Initialisierung und Instanziierung von Objekten. Durch die Initialisierung von Objekten auf faule Weise können Sie vermeiden, dass Sie sie überhaupt erstellen müssen, wenn sie nie benötigt werden, oder Sie können die Initialisierung verschieben, bis sie zuerst aufgerufen werden. Weitere Informationen finden Sie unter Lazy Initialization.

Example 1

Das folgende Beispiel zeigt, wie man einen Wert mit Lazy<T> initialisiert. Gehen Sie davon aus, dass die Lazy-Variable möglicherweise nicht erforderlich ist, abhängig von einem anderen Code, der die someCondition-Variable auf true oder false setzt.

Dim someCondition As Boolean = False

Sub Main()
    'Initialize a value with a big computation, computed in parallel.
    Dim _data As Lazy(Of Integer) = New Lazy(Of Integer)(Function()
                                                             Dim result =
                                                                 ParallelEnumerable.Range(0, 1000).
                                                                 Aggregate(Function(x, y)
                                                                               Return x + y
                                                                           End Function)
                                                             Return result
                                                         End Function)

    '  Do work that might or might not set someCondition to True...

    '  Initialize the data only if needed.
    If someCondition = True Then
        If (_data.Value > 100) Then
            Console.WriteLine("Good data")
        End If
    End If
End Sub
  static bool someCondition = false;
  // Initialize a value with a big computation, computed in parallel.
  Lazy<int> _data = new Lazy<int>(delegate
  {
      return ParallelEnumerable.Range(0, 1000).
          Select(i => Compute(i)).Aggregate((x,y) => x + y);
  }, LazyThreadSafetyMode.ExecutionAndPublication);

  // Do some work that might or might not set someCondition to true...

  // Initialize the data only if necessary.
  if (someCondition)
  {
      if (_data.Value > 100)
      {
          Console.WriteLine("Good data");
      }
  }

Example 2

Das folgende Beispiel zeigt, wie Sie mithilfe der System.Threading.ThreadLocal<T> Klasse einen Typ initialisieren, der nur für die aktuelle Objektinstanz im aktuellen Thread sichtbar ist.

// Initialize a value per thread, per instance.
ThreadLocal<int[][]> _scratchArrays =
    new(InitializeArrays);

static int[][] InitializeArrays() => [new int[10], new int[10]];

// Use the thread-local data.
int i = 8;
int[] tempArr = _scratchArrays.Value[i];
    'Initializing a value per thread, per instance
    Dim _scratchArrays =
        New ThreadLocal(Of Integer()())(Function() InitializeArrays())

    ' use the thread-local data
    Dim tempArr As Integer() = _scratchArrays.Value(i)
    ' ...
End Sub

Function InitializeArrays() As Integer()()
    Dim result(10)() As Integer
    ' Initialize the arrays on the current thread.
    ' ... 

    Return result
End Function

See also