请看一下代码。瞥一眼应该不会花很长时间。

class Teacher
    {
        private int _id;
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _message;
        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        public Teacher(int id, string msg)
        {
            _id = id;
            _message = msg;
        }

        private List<Course> _items;
        public List<Course> GetCourses()
        {
            return _items;
        }

        public Teacher()
        {
            if (_items == null)
            {
                _items = new List<Course>();
            }

            _items.Add(new Course(1, "cpp"));
            _items.Add(new Course(1, "java"));
            _items.Add(new Course(1, "cs"));
        }

        public void Show()
        {
            Console.WriteLine(this._id);
            Console.WriteLine(this._message);
        }

        public void ShowList()
        {
            foreach(Course c in _items)
            {
                c.Show();
            }
        }
    }

    class Course
    {
        private int _id;
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _message;
        public string Message
        {
            get { return _message; }
            set { _message = value; }
        }

        public Course(int id, string msg)
        {
            _id = id;
            _message = msg;
        }

        private List<Teacher> _items;
        public List<Teacher> GetTeachers()
        {
            return _items;
        }

        public Course()
        {
            if(_items == null)
            {
                _items = new List<Teacher>();
            }

            _items.Add(new Teacher(1, "ttt"));
            _items.Add(new Teacher(1, "ppp"));
            _items.Add(new Teacher(1, "mmm"));
        }

        public void Show()
        {
            Console.WriteLine(this._id);
            Console.WriteLine(this._message);
        }

        public void ShowList()
        {
            foreach (Teacher t in _items)
            {
                t.Show();
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Teacher t = new Teacher();
            t.ID = 1;
            t.Message = "Damn";

            t.Show();
            t.ShowList();

            t.GetCourses().Clear();

            t.Show();
            t.ShowList();

            Console.ReadLine();
        }
    }

由于GetCourse()返回_items的引用,因此调用t.GetCourses().Clear();会清除Course实例中的基础Teacher -list。

我要防止这种行为。也就是说,GetCourse()将返回一个列表,但它不可修改。

如何实现呢?

最佳答案

您可以创建列表的副本,也可以将其包装在ReadOnlyCollection中:

private List<Course> _items;
public IList<Course> GetCourses()
{
    return new List<Course>(_items);
}

或者
private List<Course> _items;
public IList<Course> GetCourses()
{
    return new ReadOnlyCollection<Course>(_items);
}

第一个选项创建一个独立的列表-调用者将能够对其进行修改,添加或删除项,但这些更改不会在教师对象的列表中显示。第二个选项只是现有列表的包装器-因此对集合的任何更改都将通过包装器可见。调用者将无法对集合进行任何更改。

请注意,在这两种情况下,如果列表引用的Course对象的数据均已更改,则这些更改将以两种方式均可见-如果要停止这种情况,则必须克隆每个Course

10-04 14:28