[英]Does “readonly” (C#) reduce memory usage?
在C#中,将字段设置为readonly会减少内存使用量吗?
即
DBRepository _db = new DBRepository();
VS
readonly DBRepository _db = new DBRepository();
只是好奇。 谢谢。
没有。
这意味着除了在声明点或构造函数中,您无法分配它。 您也不能将它作为ref
或out
参数传递给方法。
编辑:基于以下评论。 以下字段是readonly
因为您希望调用者具有对string.Empty
直接读取权限,但您不希望它们将其设置为其他字段。
public sealed class String
{
public static readonly string Empty = "";
}
此外,有时当我将List<>
或Dictionary<>
作为类中的字段时,我将声明它readonly
以表明我想要使用其成员(甚至添加和删除项目等)但我从来没有想要实际为其分配不同的List或Dictionary对象。
还有一个编辑:确保您阅读了已弃用的Path.InvalidPathChars字段(在备注部分中),以显示当您不了解readonly
是什么时可能发生的严重问题。
编号readonly
和const
基本上用于相同的目的:防止在运行时赋值。 但是,它们具有语义上不同的用途。
readonly与const
const
字段在编译时计算,只能在声明时初始化,而readonly
字段在运行时计算,并且可以在构造函数和声明站点初始化。
此外, const
字段值存储为元数据的一部分,因此在声明它的类的相关构造函数中初始化,而readonly
字段必须在运行时计算。
是!
是? 是! 怎么样? 简单。 只读字段无法获取新值,因此您无法创建第二个DBRepository并将其分配给此字段。 如果它不是只读的,那么您可以编写代码,该代码将为该字段重新分配新值。 在重新分配和垃圾收集器清除旧值之间的时间内,您将使用更多的内存。 此外,如果DBRepository的清理有内存泄漏,则将新值重新分配给此字段将导致多个内存泄漏。
可能发生此类内存泄漏的情况如下:1)您为_db分配值。 2)您将_db的值分配给另一个字段。 3)您将新值重新分配给_db。 此时,内存中将有两个DBRepository对象,因为旧对象仍然是从另一个对象引用的。 因此,在第二个字段释放旧对象之前,不会释放旧对象。
但这非常挑剔而且非常罕见。 答案“不”更合适。 不要使用“ReadOnly”来节省内存,因为你出于错误的原因使用它。 使用“ReadOnly”确保其他人不会将值重新分配给此字段。 (基本上,我说它可以减少内存使用量......)
readonly在您想要将对象用作键时非常有用。 此密钥不应更改,否则您无法访问它提供的访问权限。
例如; 1)使用ASP.NET站点中的事件,您可以使用Control中的Events集合。 在您的控件中,您将保留一个只读对象字段来引用集合中的事件处理程序。 2)在多线程中,您可能需要同步访问。 可以这样做以将lock语句与要锁定的只读对象组合。
答案否是从一个已经知道所有技巧和陷阱的优秀表现聚焦编码器的角度写的,例如:
答案是和一个没有意识到C#设计陷阱的编码员非常相关,或者是一个吞下“剖析是邪恶的”coolade的人。
我在代码中初始化了很多(甚至很多)矩阵和数组。 我注意到懒惰初始化:if(variable == null)// variable = new Variable()
似乎不如建造前线那么高效。 由于readonly强制您在构造函数中构造,因此您可以获得内存中数据本地化的好处,并防止您在运行时进行其他灾难性的“构建和替换”操作。 C#可以在垃圾收集器上狠狠地窒息。
C#允许我们非常容易地编写非常有效的代码。 malloc是一种迫使我们思考(de)分配的方法。 以同样的方式,readonly迫使我们思考它。
运行CLRProfiler,自己查看你发送了多少内存垃圾邮件。 如果你一直在写HPC而没有几乎超人的纪律,那么你很可能是垃圾邮件堆,而readonly可以帮助阻止你这样做。
也就是说,如果您不编写HPC代码,那么过早优化是所有有关机器架构学习的根本。 哦,不,等等......根据标准学说,我的意思是邪恶。 所有人都欢呼标准学说。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.