使用未分配的局部变量'访问器

时间:2015-04-01 18:28:51

标签: c# compiler-errors

有人可以帮助我发现这里的错误吗?

accessor.Dispose();

导致编译器错误,但仅在Read方法中。写入编译没有阅读,所以我很困惑......

    public bool Read(ref byte[] bytes)
    {
        MemoryMappedViewAccessor accessor;
        Lock.WaitOne();
        try
        {                
            accessor = Mmf.CreateViewAccessor(0, DataLength);
            bytes = new byte[DataLength];
            accessor.ReadArray<byte>(0, bytes, 0, DataLength);                
        }
        catch
        {
            return false;
        }
        finally
        {
            accessor.Dispose();
            Lock.ReleaseMutex();
        }

        return true;
    }

    public bool Write(byte[] bytes)
    {
        MemoryMappedViewAccessor accessor;
        Lock.WaitOne();
        try
        {
            DataLength = bytes.Length;
            accessor = Mmf.CreateViewAccessor(0, bytes.Length);
            accessor.WriteArray<byte>(0, bytes, 0, bytes.Length);
        }
        catch
        {
            return false;
        }
        finally
        {
            Dispose();
            Lock.ReleaseMutex();
        }
        return true;
    }

4 个答案:

答案 0 :(得分:2)

可能的情况是,try内部和accessor之前的异常被赋予一个值。有些方法可能会发生:

  1. 线程中止异常
  2. 分配新对象的内存不足异常
  3. 您要分配给它的对象的构造函数中的异常。
  4. 至于该怎么做;有两个简单的选项:

    1. 对该变量使用using,以便编译器可以为您完成所有工作。
    2. accessor初始化为null,并且只有在它为非空的情况下才会将其丢弃。

答案 1 :(得分:1)

问题是你正在使用变量,但如果抛出异常,它可能无法初始化。

我会重构这个以使用using块代替:

public bool Read(ref byte[] bytes)
{
    Lock.WaitOne();
    try
    {                
        using (MemoryMappedViewAccessor accessor = Mmf.CreateViewAccessor(0, DataLength))
        {
            bytes = new byte[DataLength];
            accessor.ReadArray<byte>(0, bytes, 0, DataLength);                
            return true;
        }
    }
    catch
    {
        return false;
    }
    finally
    {
        Lock.ReleaseMutex();
    }
}

替代方法是初始化为null内联,然后在调用null之前检查Dispose,但这需要更多代码,其中使用块简化了整体代码。

答案 2 :(得分:1)

您应该在ReadWrite方法中遇到相同的错误,但Write方法中的代码是错误的,因此可以避免错误。

Write中你有:

    finally
    {
        Dispose();
        Lock.ReleaseMutex();
    }

但应该是:

    finally
    {
        accessor.Dispose();
        Lock.ReleaseMutex();
    }

编译器错误是因为有可能在finally块中结束而没有将值赋给accessor。如果在创建分配给变量的对象时遇到异常,则会发生这种情况。

要修复编译器错误,您可以在null块之前为accessor变量设置try值:

MemoryMappedViewAccessor accessor = null;

然后在finally块中检查是否有一个实际的对象要处置:

    finally
    {
        if (accessor != null) {
            accessor.Dispose();
        }
        Lock.ReleaseMutex();
    }

答案 3 :(得分:0)

仅对变量MemoryMappedViewAccessor accessor;进行十分转换,然后尝试在最后的Read块中使用它。所以你得到编译器error.u

但是在写中你只是调用dispose(不是accessor.Dispose())所以没有错误。可能是打字错误?

你需要在finally块之前初始化访问器。可能需要最终纠正写作。

读:

finally
        {
            accessor.Dispose();
            Lock.ReleaseMutex();
        }

写:

 finally
        {
            Dispose();
            Lock.ReleaseMutex();
        }