类属性正在更改
本文关键字:属性 | 更新日期: 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的变体。