Cha*_*eus 12 c# memory performance
在C#中,将字段设置为readonly会减少内存使用量吗?
即
DBRepository _db = new DBRepository();
Run Code Online (Sandbox Code Playgroud)
VS
readonly DBRepository _db = new DBRepository();
Run Code Online (Sandbox Code Playgroud)
只是好奇.谢谢.
Sam*_*ell 20
没有.
这意味着除了在声明点或构造函数中,您无法分配它.您也不能将其作为方法ref或out参数传递给方法.
编辑:基于以下评论.以下字段是readonly因为您希望调用者具有直接读取权限string.Empty,但您不希望他们将其设置为其他内容.
public sealed class String
{
public static readonly string Empty = "";
}
Run Code Online (Sandbox Code Playgroud)
此外,有时当我在一个类中有一个List<>或Dictionary<>作为一个字段时,我会声明它readonly表明我想要使用它的成员(甚至添加和删除项目等),但我从来不想实际分配一个不同的列表或者Dictionary对象.
还有一个编辑:确保您阅读了已弃用的Path.InvalidPathChars字段(在备注部分中),以显示当您不了解什么readonly是和不是什么时可能发生的严重问题.
不,readonly并且const基本上用于相同的目的:防止在运行时分配值.但是,它们具有语义上不同的用途.
readonly与const
一个const场,在被评估的编译时间,只能在声明被初始化,而readonly外地在计算运行时间,既可以在构造函数和声明的网站进行初始化.
此外,const字段值存储为元数据的一部分,因此在声明它的类的相关构造函数中初始化,而readonly字段必须在运行时计算.
是!
是?是! 怎么样?简单.只读字段无法获取新值,因此您无法创建第二个DBRepository并将其分配给此字段.如果它不是只读的,那么您可以编写代码来重新为该字段分配新值.在重新分配和垃圾收集器清除旧值之间的时间内,您将使用更多的内存.此外,如果DBRepository的清理有内存泄漏,则将新值重新分配给此字段将导致多个内存泄漏.
可能发生此类内存泄漏的情况如下:1)您为_db分配值.2)您将_db的值分配给另一个字段.3)您将新值重新分配给_db.此时,内存中将有两个DBRepository对象,因为旧对象仍然是从另一个对象引用的.因此,在第二个字段释放旧对象之前,不会释放旧对象.
但这非常挑剔而且非常罕见.答案"不"更合适.不要使用"ReadOnly"来节省内存,因为你出于错误的原因使用它.使用"ReadOnly"确保其他人不会将值重新分配给此字段.(基本上,我说它可以减少内存使用量......)