将对象设置为null会导致C#垃圾收集器释放它占用的内存吗?

时间:2015-12-08 21:56:54

标签: c# string memory null garbage

我有一个多次被多次调用的方法。

public FilesCollection loadCollectionFromDirectory(string directory) 
        {
            string errorMessage;
            FilesCollection collection = new FilesCollection(_collectionType);

            string[] files = Directory.GetFiles(directory);
            foreach (string file in files)
            {
                if(file.EndsWith(".dll"))
                    collection.AddNewFileToCollection(file, out errorMessage);
            }
            files = null;
            return collection;
        }

我非常确定调用此方法的方法会占用大量内存,因为每次运行此方法时都会初始化字符串数组。根据我的理解,每次再次运行此方法时,字符串数组将设置为新的字符串集合,旧字符串将保留在内存中,直到垃圾收集到达它们。那是对的吗?据我所知,垃圾收集并不足够快。还有很多其他问题会影响我的内存异常,但我认为太多"幽灵字符串"是一个重要原因。如果我设置files = null就像我现在正在做的那样,那会导致GC更早出现吗?我是否误解了垃圾收集和内存管理的基本原理?

我想我最大的问题是 - 如果我一遍又一遍地执行string [] files = Directory.GetFiles(目录)而不对数组做些什么,这会导致一堆鬼串堵塞我的系统吗?

2 个答案:

答案 0 :(得分:2)

使files = null使字符串集合可用于垃圾收集,但不会立即释放内存。当内存不足时调用垃圾收集器。如果在函数文件[]的范围内太大,一种方法是只获取所需的文件。

    public FilesCollection loadCollectionFromDirectory(string directory) 
    {
        string errorMessage;
        FilesCollection collection = new FilesCollection(_collectionType);

        string[] files = Directory.GetFiles(directory,"*.dll");
        foreach (string file in files)
        {
           collection.AddNewFileToCollection(file, out errorMessage);
        }
       // files = null;
        return collection;
    }

无论你是否null,因为函数范围结束,本地变量files将可用于垃圾收集。

答案 1 :(得分:0)

我不确定,但为什么不尝试使用List<string>代替string[]。这应该是关于记忆的诀窍:)请告诉我这是否适合你。