在此代码上:

public static string Base64FromFileName(string fileName)
{
    try
    {
        FileInfo fInfo = new FileInfo(fileName);
        long numBytes = fInfo.Length;
        FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fStream);
        byte[] bdata = br.ReadBytes((int)numBytes);
        br.Close();
        fStream.Close();
        return Convert.ToBase64String(bdata);
    }
    catch(Exception e)
    {
        throw e;
    }
}


...我得到了Visual Studio的代码分析工具的警告,“请勿多次处置对象...为避免生成System.ObjectDisposedException,您不应在一个对象上多次呼叫处置” fStream.Close();“线。

为什么? fStream是否位于上面关闭BinaryReader的行中?

无论如何我都不会更好地重构它:

. . .
using (FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
    using (BinaryReader br = new BinaryReader(fStream))
    {
        byte[] bdata = br.ReadBytes((int)numBytes);
    } //br.Close();
} //fStream.Close();
. . .


最佳答案

BinaryReader.Close还会关闭基础流,因此确实会导致该流被丢弃两次。但这不是一个真正的问题,处理两次不会有任何伤害。

你可以写得更好

using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
using (var br = new BinaryReader(fs, new UTF8Encoding(), true))
{
    return Convert.ToBase64String(br.ReadBytes((int)numBytes));
}


这是防弹版本:


任何成功构造的东西都可以保证被丢弃
您不会处理流两次,因为leaveOpen构造函数上的boolean BinaryReader参数可确保处理(关闭)它也不会关闭流

关于c# - 为什么代码分析会在这里告诉我“不要多次处置对象”:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24336960/

10-12 16:48