Bagikan melalui


Cara: Melakukan inisialisasi objek secara tunda

Kelas System.Lazy<T> menyederhanakan tugas melakukan inisialisasi secara malas dan instansiasi objek. Dengan menginisialisasi objek dengan cara yang malas, Anda dapat menghindari harus membuatnya sama sekali jika tidak pernah diperlukan, atau Anda dapat menunda inisialisasi mereka sampai pertama kali diakses. Untuk informasi selengkapnya, lihat Inisialisasi Tertunda.

Example 1

Contoh berikut menunjukkan cara menginisialisasi nilai dengan Lazy<T>. Asumsikan bahwa variabel malas mungkin tidak diperlukan, tergantung pada beberapa kode lain yang mengatur someCondition variabel ke true atau 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

Contoh berikut menunjukkan cara menggunakan kelas System.Threading.ThreadLocal<T> untuk menginisialisasi tipe yang hanya terlihat oleh instance objek saat ini dalam thread saat ini.

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