为什么NetCoreApp 2中不存在MemoryStream.GetBuffer和MemoryStream.Close?

时间:2017-07-29 05:43:21

标签: c# .net-core .net-standard

我想将旧项目转换为 netcoreapp2.0 ,但我有三个问题

enter image description here

为什么NetCoreApp 2中不存在以下API?

  1. MemoryStream.GetBuffer()
  2. MemoryStream.Close()
  3. BinaryWriter.Close()
  4. 虽然这些功能似乎已经实施

    netstandard2.0_diff

    .NET Core API Reference version 2.0

    我如何访问这些?

3 个答案:

答案 0 :(得分:3)

GetBuffer()已被删除。您应该使用GetBuffer()而不是TryGetBuffer()方法。如果您有兴趣(source):

  

删除GetBuffer的原因是因为它在一般情况下被破坏,并且只适用于实际构建MemoryBuffer本身的人并且知道正在使用的底层缓冲区的确切部分。例如,MemoryBuffer上有一些构造函数,它们接受缓冲区和一个起始索引,并且起始索引根本没有反映在GetBuffer返回的内容中,因此在不知道起始索引的情况下调用它的其他人可能会查看外部的内存。 MemoryStream的。这就是为什么TryGetBuffer使用ArraySegment,因此它可以将起始索引和长度传递给调用者,这样他们就可以适当地扩展到MemoryStream使用的底层缓冲区。

Close()方法被删除为Dispose的副本。来自原始issue

using (var ms = new MemoryStream())
{
// ...
} // automatically Disposed(Closed) here

或直接致电

var ms = new MemoryStream();
// ...
ms.Dispose() // Closed here

更新:看起来有关Close的信息仅对.NET Core< 2.0。

Here是.NET Core 2.0的Close()方法说明。有意思的是,不推荐使用它:

  

请确保正确处理流,而不是调用此方法。此方法调用Dispose,指定true以释放所有资源。您不必专门调用Close方法。相反,请确保正确处理每个Stream对象。

答案 1 :(得分:1)

.NET Core 2.0中提供了Close方法,我刚刚安装了VS 2017 Prev-5.13,其中包括.Net Core 2.0 Preview,我可以使用Close方法。

.NET Core / .NET Standard中的新策略是尽可能地保持API兼容性(尽管不是完全兼容),因此大多数构建的二进制文件都与新的生态系统兼容。

之前的一些清理API的决定被颠倒过来,以保持兼容性,而不是Windows特定的。

Screenshot of Stream class

Screenshot of the VS Version

答案 2 :(得分:0)

我发现了问题,我使用VS 2017 15.2创建项目然后我使用dotnet core 2构建它所以我必须删除obj和bin文件夹并再次构建,似乎有些依赖项设置在obj文件夹中设置。