在C#中,以下是否保存了任何内存?
private List<byte[]> _stream;
public object Stream
{
get
{
if (_stream == null)
{
_stream = new List<byte[]>();
}
return _stream;
}
}
编辑:抱歉,我想我应该更具体一点。
特别是使用“对象”而不是列表...我认为这有点自然,因为这是一件很奇怪的事情。
答案 0 :(得分:5)
它可以节省很少的内存。空List<byte[]>
将占用的内存量是字节大小。
原因是你的引用变量_stream
只需要分配足够的内存来保存对象的引用。分配对象后,它将占用一定量的内存,这些内存可能会随着时间的推移而增大或缩小,例如将新的byte[]
添加到List
时。但是,对该对象的引用占用的内存将保持相同的大小。
这样更简单,更不容易出现导致头痛的角落情况:
private List<byte[]> _stream = new List<byte[]>();
public object Stream
{
get
{
return _stream;
}
}
虽然在大多数情况下,当它们是集合/数组等时,返回对私有成员的引用并不是最理想的。最好返回_stream.AsReadOnlyCollection()
。
答案 1 :(得分:1)
与什么相比节省内存?
byte[][] _stream;
可能?那么不,List<T>
将占用更多的内存,因为它的核心是一个数组(不一定是其内容的大小,但通常更大),并且还需要进行一些状态管理。
答案 2 :(得分:1)
这是一个懒惰的加载。只有在有人请求时才会创建流。除非是必需的,否则它不会创建流(在您的情况下是列表)。
有人可能会说它会节省一些内存,因为除非需要,否则它不会使用任何内存。所以在使用流之前没有为它分配内存。
答案 3 :(得分:1)
如果您的编辑表明您在询问使用object
关键字而不是List<byte[]>
作为属性的类型是否可以节省内存,则不会。并且您的if
块仅在第一次调用属性时保存可忽略不计的内存量(以及实例化时的cpu)直到。它确实使对该属性的第一次调用稍慢。如果对属性有意义,请考虑返回null。并且,就像另一个回答者所建议的那样,将属性保持为只读可能会更好,除非您希望其他类更改它。一般来说,我认为像这样的优化尝试大多是错误的,会使你的代码难以维护。
答案 4 :(得分:0)
你确定一个Stream不只是一个字节[]或一个字节列表吗?甚至更好,一个MemoryStream? :)我觉得你有点困惑,所以一个更大的例子和一些场景细节将有很大帮助。
答案 5 :(得分:0)
真正的对象是什么
我建议将对象视为结构...并将对象引用视为指向该结构的指针。
如果您实例化一个对象,则为“struct”保留内存以及其所有字段(以及对它正在实现的类的引用),以及构造函数保留的所有内存(其他对象,数组等等)
在List中你保留了用于状态保存的内存(我不知道它是如何在C#中实现的)和初始内部数组,可能有10个引用。所以...如果算上它的东西(假设32位运行时,我不是.net专家):
所以在我估计它大概是48个字节。但这取决于实施。
正如SoloBold所说:大部分时间都不值得。