在C#中,是否将字段设置为只读,以减少内存使用量?“只读”(C#)是否会减少内存使用量?
即
DBRepository _db = new DBRepository();
VS
readonly DBRepository _db = new DBRepository();
只是好奇。谢谢。
在C#中,是否将字段设置为只读,以减少内存使用量?“只读”(C#)是否会减少内存使用量?
即
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在您希望将对象用作关键字的情况下非常有用。这个键不应该改变,否则你不能访问它提供的访问权限。
例如; 1)使用ASP.NET网站中的事件,可以使用Control中的Events集合。在你的控件中,你将保持只读对象字段来引用集合中的事件处理程序。 2)在多线程中,您可能需要同步访问。这可以将锁定语句与要锁定的只读对象组合在一起。
第readonly
和const
基本上用于相同的目的:防止在运行时分配值。但是,它们在语义上有不同的用途。
只读与常量
甲const
场在评价编译时间,并且只能在声明被初始化,而readonly
场在运行时间评价和既可以在构造和被初始化在宣布现场。
另外,const
字段值作为元数据的一部分存储,因此在声明它的类的相关构造函数中初始化,而readonly
字段必须在运行时计算。
是的!
是吗?是!怎么样?简单。只读字段无法获得新值,因此您无法创建第二个DBRepository并将其分配给此字段。如果它不是只读的,那么你可以编写代码,将这个字段重新分配一个新的值。在重新分配和垃圾回收器清除旧值的时间之间,您将会使用更多的内存。此外,如果清理DBRepository存在内存泄漏,那么为该字段重新分配新值将导致多次内存泄漏。
发生此类内存泄漏的情况如下: 1)将值分配给_db。 2)将_db的值分配给另一个字段。 3)您为_db重新分配一个新值。 此时,您将在内存中拥有两个DBRepository对象,因为旧对象仍然是从另一个对象引用的。因此,直到第二个字段释放旧对象才会被释放。
但这是非常挑剔的,相当罕见。答案“否”更合适。不要使用“ReadOnly”来节省内存,因为你会因为错误的原因而使用它。使用“ReadOnly”来确保其他人不会为此字段重新分配值。 (基本上,我说这可以减少内存使用量...)
没有从有不错的表现视角写的答案集中编码器谁已经知道所有的花招和陷阱例如:
答案是与编码人员非常相关,他们没有意识到C#设计的缺陷,或者吞下了“剖析是邪恶”的酷刑。
我在我们的代码中初始化很多(甚至可能是很多)矩阵和数组。我已经注意到,懒惰初始化: if(variable == null) // variable = new Variable()
看起来性能低于构建预先。既然readonly强迫你在构造函数中构造,你会在内存中获得数据本地化的好处,并且阻止你在运行时做其他灾难性的“构建和替换”。 C#可以在垃圾收集器上大肆窒息。
C#使我们能够非常轻松地编写非常有效的代码。 malloc是迫使我们考虑(de)分配的一种方式。同样,只读也迫使我们考虑它。
运行CLRProfiler,看看你自己有多少内存垃圾邮件。如果您一直在编写HPC而没有几乎超人的纪律,那么您有可能发送垃圾邮件并且只读,可能会阻止您这样做。这就是说,如果你不编写HPC代码,那么过早优化是所有关于机器体系结构学习的根源。哦,不,等等......我的意思是邪恶,按照标准的教义。所有人都欢呼标准的教义。
问题中的问题。如果只读,不能减少在田间只读的政治用途的记忆吗? – pedrofernandes 2009-07-20 09:29:28