【发布时间】:2014-11-13 17:35:04
【问题描述】:
我在重构一段代码时遇到问题。我模糊地理解了这个问题,但多一点洞察力和/或解释对我理解和解决问题很有帮助。
首先是原始代码块:
FileStream fS = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite);
Int64 fSLength = fS.Length;
Int64 remainingNotFulEncDecBlock = fSLength % 1;
fS.Seek(0, SeekOrigin.End);
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock;
Byte fillByte = (Byte)'$';
for (Int32 i = 0; i < nrBytesToAdd - 1; i++)
fS.WriteByte(fillByte);
fS.WriteByte((Byte)nrBytesToAdd);
fSLength = fS.Length;
fS.Close();
重构的唯一目的是我们不再需要打开物理文件。相反,我们提供byte[]。
这是我重构的代码:
MemoryStream fS = new MemoryStream(_data);
Int64 fSLength = fS.Length;
Int64 remainingNotFulEncDecBlock = fSLength % 1;
fS.Seek(0, SeekOrigin.End);
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock;
Byte fillByte = (Byte)'$';
for (Int32 i = 0; i < nrBytesToAdd - 1; i++)
fS.WriteByte(fillByte);
fS.WriteByte((Byte)nrBytesToAdd);
fSLength = fS.Length;
fS.Close();
上面的代码产生错误MemoryStream不能展开就行了
fS.WriteByte((Byte)nrBytesToAdd);
最初我不得不用谷歌搜索错误并阅读。现在这很有意义,因为内存流已设置为特定大小。我不清楚的是我应该如何进行。我是否要创建另一个未设置为特定大小的 MemoryStream 对象,从而允许我执行以下操作:
MemoryStream ms = new MemoryStream();
ms.WriteByte((Byte)nrBytesToAdd);
我对这种技术的阅读表明,这比将MemoryStream 初始化为指定的byte[] 性能要差,但是我不知道(找不到)另一种动态扩展MemoryStream 的方法。一个优点是现在和在可预见的将来,byte[] 的数量将非常小,因此虽然速度较慢,但可能不会对性能产生重大影响。
【问题讨论】:
-
A
MemoryStream可以调整大小,只要您不使用特定的byte[]缓冲区对其进行初始化(即,以除了您在此处使用它的方式之外的任何方式使用它)。但是您发布的代码意义不大,很难知道正确的答案是什么。fsLength % 1总是返回 0,那何必呢?鉴于此,您的循环如何做任何事情,因为nrBytesToAdd始终为 1,因此i < nrBytesToAdd - 1始终为假。如果您想为您的问题提供真正有用的答案,您应该发布一个很好的代码示例。见stackoverflow.com/help/mcve