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

本文关键字:释放 收集器 内存 设置 对象 null 是否 | 更新日期: 2023-09-27 18:26:08

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

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(Directory),而不对数组做任何操作,这会导致一堆重影字符串堵塞我的系统吗?

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

使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将可用于垃圾收集。

我不太确定,但为什么不尝试使用List<string>而不是string[]呢。这应该可以改善记忆力:)请告诉我这对你是否有效。