C# 静态函数返回字符串数组时会发生什么情况?

C# 静态函数返回字符串数组时会发生什么情况?,c#,.net,garbage-collection,C#,.net,Garbage Collection,我有一个返回字符串数组的静态函数。我从循环中调用这个函数,并将返回值存储到临时数组中。 我的问题是GC会在第一代中解决这个问题,还是会在第二代中继续存在 下面您可以看到代码片段 ------更新代码-------------- 谢谢你的回复。 假设我会有这样的东西,这会清理字符串数组吗 public static string[] SplitString(string strLine_) { string[] bit_ = strLine_.Split(new[]

我有一个返回字符串数组的静态函数。我从循环中调用这个函数,并将返回值存储到临时数组中。 我的问题是GC会在第一代中解决这个问题,还是会在第二代中继续存在

下面您可以看到代码片段

------更新代码--------------

谢谢你的回复。 假设我会有这样的东西,这会清理字符串数组吗

    public static string[] SplitString(string strLine_)
    {
        string[] bit_ = strLine_.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
    return bit_;
    }
//---内部不同功能-------//

   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's not recommended to call GC manually //but for this   testing purpose to check if it cleans up string //array.
 }
我的问题是GC会在第一代中解决这个问题,还是会在第二代中继续存在

请注意,这里的世代是Gen0和Gen1,您的字符串永远不会到达Gen2

两者都可能发生。当GC在while循环期间发生时,一些字符串将在使用中可访问并从Gen0升级到Gen1。但概率很低,而且不会超过少数


所以这里没什么可担心的。

由于阵列的寿命很短,几乎所有实例都将保留在第1代中


无法保证没有实例不会进入第2代,这取决于垃圾收集何时发生以及其他情况。但是,这应该足够罕见。

我不确定您是否可以确定地说明对象将在哪一代结束。。。这取决于GC何时执行清理运行,以及对象当时是否仍在作用域中。循环不分配任何内容,因此此数组不太可能在gen0之后继续存在。不要调用GC.Collect。事实上,除非你有确凿的证据证明你有问题,否则不要担心GC。你能分享任何指标或启发来支持应该足够少的断言,或者仅仅基于实例在如此短的时间内处于范围内,GC运行将相对稀疏的事实吗?@AntP:Yes,它基于较短的时间,并且代码中没有任何会导致大量收集的内容。这些实例一次只使用一个请记住,作用域与垃圾收集无关,因此在发生垃圾收集时,只能捕获一个实例在使用中,这限制了风险。如果我在循环结束后立即调用垃圾收集器会怎么样?@user2015971为什么要这样做?看看它的内存是否会被清理。我不确定如何仅为第1代调用GC。当然,字符串足够大,结果数组直接指向LOH。@BrianRasmussen-我想我们可以排除这种情况。是的,行不是很大,但循环本身很大。意思是有很多行,但行又短了:没什么好担心的。所有字符串数组都是短期的。对GC.Collect的调用;这是唯一的问题。