У меня есть статическая функция, которая возвращает массив строк. Я вызываю эту функцию из цикла и сохраняю возвращаемое значение во временном массиве. Мой вопрос в том, собирается ли GC очистить это в первом поколении или он остался бы и повесился бы как поколение 2.
Ниже вы можете увидеть фрагмент кода.
-----------UPDATED CODE----------------------------
Спасибо за весь ответ. Скажем, у меня будет что-то вроде этого, это очистит строковые массивы?
public static string[] SplitString(string strLine_)
{
string[] bit_ = strLine_.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
return bit_;
}
/ / ------inside отличается function--------------//
private void Foo()
{
while (numOfVolElts > count)
{
line = sr_.ReadLine();
if (!string.IsNullOrEmpty(line))
{
string[] bit4 = Definitions.SplitString(line);
for (int j = 0; j < bit4.Length; j++)
{
int matNum = Convert.ToInt32(bit4[j]);
volElements[count].matnr = matNum;
count++;
if (matNum > numMaterials)
numMaterials = matNum;
}
}
}
//GC.Collect(); //I know it not recommended to call GC manually //but for this testing purpose to check if it cleans up string //array.
}
Мой вопрос в том, собирается ли GC очистить это в первом поколении или он остался бы и повесился бы как поколение 2.
Обратите внимание на то, что генераторы здесь Gen0 и Gen1, ваши строки никогда не попадут в Gen2.
Оба могут случиться. Когда GC происходит во время этого цикла while, некоторые из строк будут использоваться (достижимы) и будут продвигаться от Gen0 до Gen1. Но с низкой вероятностью и не более чем горсткой.
Так что не о чем беспокоиться.
Поскольку массив довольно короткий, вероятно, почти каждый экземпляр останется в поколении 1.
Нет никаких гарантий, что никакие экземпляры не будут поступать в поколение 2, это зависит от того, когда происходит сборка мусора и что еще происходит. Однако это должно быть достаточно редко.