Проблема целостности данных C # - PullRequest
1 голос
/ 21 апреля 2009

моя проблема в том, что присвоение 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];
    }

}

Из АудиоФабрики:

    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);
    }}

Ответы [ 3 ]

4 голосов
/ 21 апреля 2009

Судя по всему, audiofactory.MoveNext(stepSize) остается на той же ссылке. Это приводит к тому, что audiofactory.Current(stepSize) остается по тому же адресу.

По этой причине, но decodedProxyExcerpt1 и decodedProxyExcerpt2 указывают на одну и ту же ссылку и поэтому переходят от одного к другому.

Итак, проблема кроется в вашем AudioFactory классе.

1 голос
/ 21 апреля 2009

Экземпляры классов хранятся в виде ссылок.

decodedProxyExcerpt1 и decodedProxyExcerpt2 являются ссылками на один и тот же объект - audiofactory.CurrentExcerpt.

0 голосов
/ 21 апреля 2009

Я спросил друга об этом, который подсказал мне, что я мог подумать в C ++, где присвоение массива создает копию, вместо C #, где присвоение массива создает ссылку.

Если это правильно и

decodedProxyExcerpt1 = audiofactory.Current (stepSize);

устанавливает ссылку (не копию), тогда перезапись полностью понятна.

...