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

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

没有.

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

编辑:基于以下评论.以下字段是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是和不是什么时可能发生的严重问题.

  • @ pho3nix:嗯,执行设计实践怎么样?(如果不应修改变量,请不要修改它!) (6认同)
  • readonly即将确保该字段处于初始状态.例如,如果field不是readonly,则需要检查它是否为null.使用readonly,您可以在对象创建期间进行单一检查,然后使用此字段而不会感到痛苦. (2认同)

Mik*_*e J 5

不,readonly并且const基本上用于相同的目的:防止在运行时分配值.但是,它们具有语义上不同的用途.

readonly与const

一个const场,在被评估的编译时间,只能在声明被初始化,而readonly外地在计算运行时间,既可以在构造函数和声明的网站进行初始化.

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


Wim*_*ink 5

是!

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

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

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