Partager via


Guide pratique pour effectuer une initialisation différée d’objets

La System.Lazy<T> classe simplifie le travail d’initialisation différée et d’instanciation des objets. En initialisant des objets de manière différée, vous pouvez éviter de devoir les créer du tout s’ils ne sont jamais nécessaires, ou vous pouvez reporter leur initialisation jusqu’à ce qu’ils soient accessibles pour la première fois. Pour plus d’informations, consultez Initialisation différée.

Example 1

L’exemple suivant montre comment initialiser une valeur avec Lazy<T>. Admettons que la variable paresseuse ne soit pas nécessaire, en fonction d’un autre code qui définit la variable someCondition à true ou false.

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

L’exemple suivant montre comment utiliser la System.Threading.ThreadLocal<T> classe pour initialiser un type visible uniquement par l’instance d’objet actuelle sur le thread actuel.

// 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