【问题标题】:Class property changing类属性改变
【发布时间】:2012-02-22 21:47:10
【问题描述】:

我设计了一个类,它就像一张 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];
            }
        }
    }
}

【问题讨论】:

  • 你想在这里完成什么?因为我现在可以告诉你,可能有比使用属性设置器不实际设置属性的热混乱更好的方法。
  • @Brad_Stone,还请注意您在 Tracks 上的二传手容易爆炸。你循环输入数组而不考虑它的长度甚至它的存在。
  • 这只是理解简单 get 和 set 的练习练习,没有任何进展,这只是为了让我可以快速理解为什么 Tracks 会被覆盖。设置为一个简单的琐碎任务。

标签: c# arrays class


【解决方案1】:

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

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

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

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

_Tracks = new ReadOnlyCollection<string>(tracks);

幸运的是,您不必担心字符串对象本身的内容会发生变化,因为字符串是不可变的。 重要的是,您了解当前形式的程序正在发生什么 - 我的article on reference types vs value types 可能会有所帮助。

【讨论】:

  • 太棒了,感谢您的帮助。我会尽快接受你的回答。
  • 感谢您提供更多信息。是的,我确实理解它为什么会发生变化以及我如何不做参考的概念。
【解决方案2】:

另外请注意,在 Tracks 属性的属性设置器中,如果要设置的数组的元素多于当前的 _Tracks 数组,您很可能会遇到麻烦。

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

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2022-11-04
    • 2013-02-01
    • 2013-03-17
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多