类属性正在更改

本文关键字:属性 | 更新日期: 2023-09-27 18:25:24

我设计了一个类,它的作用就像CD一样,我还有另一个类来测试我设计的类。测试类生成一个新的CD对象,并用变量等填充它。

我的问题是,测试类说我的类失败是因为对象生成后变量数组发生了变化,而这些变量并没有直接改变实际的类属性,我该如何停止这种情况?

测试等级:

string[] myCdTracks = { "Song 1", "Song 2", "Song 3" };
string[] myCdTracks2 = { "Song 1", "Song 2", "Song 3" };
CD myCd = new CD("My Songs", "Fergus", "Rock", myCdTracks);
for (int i = 0; i < myCdTracks.Length; i++)    
    {

它在不该改变的时候改变了它的值。

        myCdTracks[i] = "aaaa";
    }
    result = "PASS";
    if (myCd.Tracks.Length != testArray.Length)
    {
        result = "FAIL";
    }
    else
    {
        for (int i = 0; i < myCd.Tracks.Length; i++)
        {
            if (myCd.Tracks[i] != testArray[i])
            {
                result = "FAIL";
            }
        }
    }

我的CD类:

public class CD
{
    string _Name;
    string _Artist;
    string _Genre;
    string[] _Tracks;
    public CD(string name, string artist, string genre, string[] tracks)
    {
        _Name = name;
        _Artist = artist;
        _Genre = genre;
        _Tracks = tracks;
    }
    // ... Some properties
    public string[] Tracks
    {
        get
        {
            return _Tracks;
        }
        set
        {
            for (int i = 0; i < _Tracks.Length; i++)
            {
                _Tracks[i]= value[i];
            }
        }
    }
}

类属性正在更改

我的问题是,测试类说我的类失败是因为对象生成后变量数组发生了变化,而这些变量并没有直接改变实际的类属性,我该如何停止这种情况?

问题是,您刚刚将引用复制到构造函数中的轨道名称数组中。这意味着从外部对数组所做的任何更改仍然可以通过引用看到。一个简单的选择是克隆阵列:

_Tracks = (String[]) tracks.Clone();

或者甚至更改变量类型并创建只读集合:

_Tracks = new ReadOnlyCollection<string>(tracks);

幸运的是,您不需要担心字符串对象本身的内容会发生变化,因为字符串是不可变的。不过,了解当前形式的程序发生了什么非常重要,我关于引用类型与值类型的文章可能会有所帮助。

还要注意,在Tracks属性的属性设置器中,如果要设置的数组的元素比当前_Tracks数组多,则很可能会遇到问题。

我建议在构造函数和属性setter中都使用Jon Skeet的变体。