“readonly”(C#)是否会减少内存使用量?

时间:2009-07-20 09:24:57

标签: c# performance memory

在C#中,将字段设置为readonly会减少内存使用量吗?

DBRepository _db = new DBRepository();

VS

readonly DBRepository _db = new DBRepository();

好奇。感谢。

5 个答案:

答案 0 :(得分:19)

没有

这意味着除了在声明点或构造函数中,您无法分配它。您也无法将其作为refout参数传递给方法。

编辑:根据以下评论。以下字段为readonly,因为您希望调用者具有对string.Empty的直接读取权限,但您不希望他们将其设置为其他内容。

public sealed class String
{
    public static readonly string Empty = "";
}

另外,有时当我在课程中使用List<>Dictionary<>作为字段时,我会声明它readonly以表明我想与其成员合作(甚至添加和删​​除项目等)但我从不想实际为其分配不同的List或Dictionary对象。

还有一个编辑:请务必阅读已弃用的Path.InvalidPathChars字段(在备注部分中),以了解当您不了解readonly是什么时不会发生的严重问题

答案 1 :(得分:5)

没有。 readonlyconst基本上用于相同的目的:防止在运行时赋值。但是,它们在语义上有不同的用途。

readonly与const

{em}编译时评估const字段,只能在声明时初始化,而 run 时评估readonly字段并且可以在构造函数和声明站点进行初始化。

此外,const字段值存储为元数据的一部分,因此在声明它的类的相关构造函数中初始化,而readonly字段必须在运行时计算。< / p>

答案 2 :(得分:5)

YES!

是?是!怎么样?简单。只读字段无法获取新值,因此您无法创建第二个DBRepository并将其分配给此字段。如果它不是只读的,那么您可以编写代码,该代码将为该字段重新分配新值。在重新分配和垃圾收集器清除旧值之间的时间内,您将使用更多的内存。此外,如果DBRepository的清理有内存泄漏,那么将新值重新分配给该字段将导致多个内存泄漏。

可能发生此类内存泄漏的情况是: 1)您为_db分配值。 2)您将_db的值分配给另一个字段。 3)您将新值重新分配给_db。 此时,内存中将有两个DBRepository对象,因为旧对象仍然是从另一个对象引用的。因此,在第二个字段释放之前,旧对象不会被释放。

但这非常挑剔而且非常罕见。答案“不”更合适。不要使用“ReadOnly”来节省内存,因为你出于错误的原因使用它。使用“ReadOnly”确保其他人不会将值重新分配给此字段。 (基本上,我说它可以减少内存使用量......)

答案 3 :(得分:0)

readonly在您希望将对象用作键的情况下非常有用。此密钥不应更改,否则您无法访问它提供访问权限的内容。

例如; 1)使用ASP.NET站点中的事件,您可以使用Control中的Events集合。在您的控件中,您将保留一个只读对象字段来引用集合中的事件处理程序。 2)在多线程中,您可能需要同步访问。这可以将lock语句与要锁定的只读对象组合起来。

答案 4 :(得分:0)

答案否是从一个表现良好的编码人员的角度编写的,他已经知道所有技巧和陷阱,例如:

  1. 紧密循环中没有LINQ。真。没有。如初。
  2. 比较之前将您的枚举转换为整数
  3. 谨防价值类型结构
  4. 'new'是新的Grue
  5. CLRProfiler是你的朋友
  6. 其他剖析器会将可变施工时间放入奇怪的地方
  7. 答案是的,对于一个没有意识到C#设计陷阱的编码员来说非常相关,或者是一个吞下“剖析是邪恶的”coolade的人。

    我在代码中初始化了很多(甚至很多)矩阵和数组。我注意到懒惰的初始化: if(变量== null)   // variable = new Variable()

    似乎不如预先构建高效。由于readonly强制您在构造函数中构造,因此您可以获得内存中数据本地化的好处,并防止您在运行时进行其他灾难性的“构建和替换”操作。 C#可以在垃圾收集器上狠狠地窒息。

    C#允许我们非常容易地编写非常有效的内存代码。 malloc是一种迫使我们思考(de)分配的方法。以同样的方式,readonly迫使我们思考它。

    运行CLRProfiler,自己查看您发送了多少内存垃圾邮件。如果你一直在编写HPC而没有几乎超人的纪律,那么你很可能是垃圾邮件堆,而readonly可以帮助阻止你这样做。

    也就是说,如果您没有编写HPC代码,那么过早优化是所有机器架构学习的根本。哦,不,等等......根据标准学说,我的意思是邪恶。所有人都赞同标准学说。