Vui lòng xem mã. Nó không nên mất nhiều thời gian để có một cái nhìn thoáng qua.Danh sách <T> bị xóa sự cố
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();
}
}
Kể từ GetCourse()
trả về một tham chiếu của _items, gọi t.GetCourses().Clear();
được xóa cơ bản Course
-list trong Teacher
dụ.
Tôi muốn ngăn chặn hành vi này. Tức là, GetCourse()
sẽ trả về một danh sách nhưng nó sẽ không thể sửa đổi được.
Làm cách nào để đạt được điều đó?
Đây có phải là cách thực hiện trong C# ngay bây giờ không? Tôi ra khỏi vòng lặp C#, nhưng bạn sẽ tạo một Danh sách mới như vậy hay bạn sẽ sao chép danh sách? Tôi nghi ngờ rằng Danh sách chứa một phương pháp để sao chép sâu vào danh sách. –
@Thomas: Tôi không nghĩ có bất kỳ điều gì trong 'Danh sách' để tạo bản sao sâu. Nhân bản phần lớn là nản chí trong kinh nghiệm của tôi. –