Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс System.Lazy<T> упрощает работу по выполнению отложенной инициализации и созданию объектов. Инициализируя объекты ленивым способом, вы можете избежать необходимости создавать их вообще, если они никогда не нужны, или отложить их инициализацию до тех пор, пока они не будут впервые доступны. Дополнительные сведения см. в разделе "Отложенная инициализация".
Example 1
В следующем примере показано, как инициализировать значение с помощью Lazy<T>. Предположим, что, возможно, ленивую переменную не понадобится использовать, в зависимости от другого кода, который задает переменной значение true
или 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
В следующем примере показано, как использовать класс System.Threading.ThreadLocal<T> для инициализации типа, видимого только текущему экземпляру объекта в текущем потоке.
// 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