谨慎集合的属性的可写操作

在对集合进行线程间的操作时要分外小心,集合属性开放可写操作。由于集合是引用类型,在两个线程中改变同一个集合,可能会导致另一个线程访问时出错。

 

class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

 

class StudentTeamA
    {
        public List<Student> Students { get; set; }
    }
复制代码
class Program
    {
        static List<Student> studentList = new List<Student>()
        {
           new Student(){Name = "Janeliy",Age = 19},
           new Student(){Name = "Machial",Age = 22}
        };
        static void Main(string[] args)
        {
            StudentTeamA studentTeamA = new StudentTeamA();
            Thread thread01 = new Thread(() =>
            {
                studentTeamA.Students = studentList;
                Thread.Sleep(1000);
                Console.WriteLine(studentList.Count); // 模拟对集合属性进行运算
            });
            thread01.Start();
            Console.WriteLine("Hello World!");

            Thread thread02 = new Thread(() =>
            {
                studentList = null;
            });
            thread02.Start();
        }
    }
复制代码

上面是第一次对集合属性进行操作。

在上面对集合的运算,因为是线程对“当集合成为属性时的可写方法进行限制”,所以我认为不应该是对外面的studentList集合进行修改;改成对studentTeamA.Students的修改和输出,结果都是为null。

下面对StudentTeamA进行修改:限制了写方法,但还是开放了对其list集合的赋值。

 

复制代码
class StudentTeamA
    {
        public List<Student> Students { get; private set; }

        public StudentTeamA()
        {
            Students = new List<Student>();
        }

        public StudentTeamA(IEnumerable<Student> studentList) : this()
        {
            Students.AddRange(studentList);
        }
    }
复制代码

 

 

 

总结:该篇的主旨思想就是告诉我们,集合属性不能随便开放写操作。

 

posted @   Wen_Chen  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示