1

我的问题是下面的 decodedProxyExcerpt2 分配覆盖了 decodedProxyExcerpt1 我不知道为什么。

有什么线索吗?

提前致谢。

        DecodedProxyExcerpt decodedProxyExcerpt1 = new DecodedProxyExcerpt(stepSize);
        if (audiofactory.MoveNext(stepSize))
        {
            decodedProxyExcerpt1 = audiofactory.Current(stepSize);
        }
        // At this point decodedProxyExcerpt1.data contains the correct values.

        DecodedProxyExcerpt decodedProxyExcerpt2 = new DecodedProxyExcerpt(stepSize);
        if (audiofactory.MoveNext(stepSize))
        {
            decodedProxyExcerpt2 = audiofactory.Current(stepSize);
        }
        // At this point decodedProxyExcerpt2.data contains the correct values.
        // However, decodedProxyExcerpt1.data is overwritten and now holds the values of decodedProxyExcerpt2.data.


public class DecodedProxyExcerpt
{
    public short[] data { get; set; } // PCM data

    public DecodedProxyExcerpt(int size)
    {
        this.data = new short[size];
    }

}

来自 AudioFactory:

    public bool MoveNext(int stepSize)
    {
        if (index == -1)
        {
            index = 0;
            return (true);
        }
        else
        {
            index = index + stepSize;
            if (index >= buffer.Length - stepSize)
                return (false);
            else
                return (true);
        }
    }

    public DecodedProxyExcerpt Current(int stepSize)
    {
        Array.Copy(buffer, index, CurrentExcerpt.data, 0, stepSize);
        return(CurrentExcerpt);
    }}
4

3 回答 3

4

从外观上看,它audiofactory.MoveNext(stepSize)保持相同的参考。这导致audiofactory.Current(stepSize)留在同一地址。

出于这个原因,但是decodedProxyExcerpt1decodedProxyExcerpt2指向相同的引用,因此对一个的更改会传播到另一个。

所以,问题在于你的AudioFactory班级。

于 2009-04-21T10:06:21.670 回答
1

类的实例存储为引用。

decodedProxyExcerpt1 和 decodedProxyExcerpt2 都是对同一个对象的引用——audiofactory.CurrentExcerpt。

于 2009-04-21T11:57:55.490 回答
0

我问了一个朋友,他给了我一个提示,我可能一直在考虑在 C++ 中分配数组创建副本,而不是在 C# 中分配数组创建引用。

如果这是正确的并且

decodedProxyExcerpt1 = audiofactory.Current(stepSize);

正在设置参考(不是副本),那么覆盖是完全可以理解的。

于 2009-04-21T11:19:16.223 回答