Как я могу предотвратить выпуск объектов, созданных в цикле, в конце этой итерации цикла
Если я создаю объект и хочу, чтобы он существовал только для текущего блока кода, после чего он будет автоматически уничтожен (или, по крайней мере, помечен для уничтожения), я могу использовать scope
ключевое слово:
using System;
class Program
{
public void Program()
{
let basicString = String("Basic String");
for (let i = 0 ; i < 4 ; i++)
{
let modifiedString = scope String(s);
if (i%2 == 0)
{
modifiedString.ToUpper();
}
else
{
modifiedString.ToLower();
}
Console.WriteLine(modifiedString);
// modifiedString is marked for destruction
}
}
}
Но если мне нужно, чтобы объект оставался до окончания блока, например, для всего метода или для блока за пределами того, который он был создан, как я могу указать эту область? Например, как я могу убедиться, что строки существуют во втором цикле ниже?
using System;
using System.Collections.Generic;
class Program
{
public void Program()
{
let basicString = String("Basic String");
let modifiedStringList = scope List<String>();
for (let i = 0 ; i < 4 ; i++)
{
let modifiedString = scope String(s);
if (i%2 == 0)
{
modifiedString.ToUpper();
}
else
{
modifiedString.ToLower();
}
modifiedStringList.Append(modifiedString);
Console.WriteLine(modifiedString);
// somehow prevent modifiedString from being marked for destruction
}
modifiedStringList.RemoveAt(1);
for (let s in modifiedStringList)
{
Console.WriteLine(s);
}
// allow all of the modifiedString to be marked for destruction here
}
}
1 ответ
Решение
Вы можете использовать scope::
чтобы переменная не была помечена для уничтожения для всего метода:
using System;
using System.Collections.Generic;
class Program
{
public void Program()
{
let basicString = String("Basic String");
let modifiedStringList = scope List<String>();
for (let i = 0 ; i < 4 ; i++)
{
// modifiedString won't be destroyed until after Program() exits.
let modifiedString = scope:: String(s);
if (i%2 == 0)
{
modifiedString.ToUpper();
}
else
{
modifiedString.ToLower();
}
modifiedStringList.Append(modifiedString);
Console.WriteLine(modifiedString);
}
modifiedStringList.RemoveAt(1);
for (let s in modifiedStringList)
{
Console.WriteLine(s);
}
}
}
Если вам нужно указать произвольную область видимости между методом и текущим блоком, вы можете использовать именованный блок с BlockName: { ... }
и использовать scope:BlockName
:
using System;
using System.Collections.Generic;
class Program
{
public void Program()
{
for (let repeat=0; repeat<10; repeat++)
RepeatBlock:
{
let basicString = String("Basic String");
let modifiedStringList = scope List<String>();
for (let i = 0 ; i < 4 ; i++)
{
// modifiedString won't be destroyed until after
// the block named RepeatBlock block exits.
let modifiedString = scope:RepeatBlock String(s);
if (i%2 == 0)
{
modifiedString.ToUpper();
}
else
{
modifiedString.ToLower();
}
modifiedStringList.Append(modifiedString);
Console.WriteLine(modifiedString);
}
modifiedStringList.RemoveAt(1);
for (let s in modifiedStringList)
{
Console.WriteLine(s);
}
}
}
}