C#列表属性对添加新元素没有响应

C#列表属性对添加新元素没有响应,c#,list,properties,C#,List,Properties,在退出主功能之前,您能帮助我理解为什么repository.Courses为空,即使我刚刚通过调用repository.addcourses(course)将课程添加到存储库中退出之前?我该如何纠正这一点?我认为这可能与如何定义Courses属性有关(getter和setter)。在getter中,只有当空列表已经为null时,我才希望通过空列表进行初始化,否则我希望返回现有列表。在setter中,我想分配一个值-这应该与添加到列表的可能性相关 using Newtonsoft.Json; us

在退出主功能之前,您能帮助我理解为什么repository.Courses为空,即使我刚刚通过调用
repository.addcourses(course)将课程添加到存储库中退出之前?我该如何纠正这一点?我认为这可能与如何定义Courses属性有关(getter和setter)。在getter中,只有当空列表已经为null时,我才希望通过空列表进行初始化,否则我希望返回现有列表。在setter中,我想分配一个值-这应该与添加到列表的可能性相关

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{

    class Repo
    {

        public IList<Course> _courses;

        public IList<Course> Courses
        {
            get
            {
                if (_courses == null)
                    _courses = new List<Course>();
                return new List<Course>(_courses);
            }
            set
            {
                _courses = value;

            }
        }
        public void AddCourse(Course course)
        {
            course.Id = Courses.NextId();
            Courses.Add(course);
        }


        static void Main(string[] args)
        {
            Repo repository = new Repo();
            var path = "C:\\a1\\demos\\demo1-after\\ConsoleApplication1\\json1.json";
            var reader = new StreamReader(path);

            string text = reader.ReadToEnd();
            var course = JsonConvert.DeserializeObject<Course>(text);
            repository.AddCourse(course);

        }
    }

    public class Course : IEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Author { get; set; }
        public Course(string n, string a)
        {
            Name = n;
            Author = a;

        }
    }

    public interface IEntity
    {
        int Id { get; set; }
    }
    public static class Extensions
    {
        public static int NextId<T>(this IList<T> list) where T : IEntity
        {
            return list.Any() ? list.Max(x => x.Id) + 1 : 0;
        }
    }
}
使用Newtonsoft.Json;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序1
{
类别回购
{
公共IList_课程;
公共语文教师课程
{
得到
{
如果(_=null)
_课程=新列表();
返回新列表(_课程);
}
设置
{
_课程=价值;
}
}
公共课程(课程)
{
course.Id=Courses.NextId();
课程。添加(课程);
}
静态void Main(字符串[]参数)
{
Repo repository=new Repo();
var path=“C:\\a1\\demos\\demo1 after\\ConsoleApplication1\\json1.json”;
变量读取器=新的StreamReader(路径);
string text=reader.ReadToEnd();
var course=JsonConvert.DeserializeObject(文本);
repository.AddCourse(课程);
}
}
公共课:科学性
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串作者{get;set;}
公共课程(n串,a串)
{
Name=n;
作者=a;
}
}
公共界面的开放性
{
int Id{get;set;}
}
公共静态类扩展
{
公共静态int-NextId(此IList列表),其中T:IEntity
{
return list.Any()?list.Max(x=>x.Id)+1:0;
}
}
}

这里的问题是,您的
get
总是返回一个新列表,而不是备份字段

请尝试以下方法:

get
{
    if (_courses == null) _courses = new List<Course>();
    return _courses;
}    
get
{
如果(_courses==null)_courses=new List();
复课;;
}    

我注意到getter of Courses返回一个新列表,而不是对字段的引用。这是因为你不想让班外的任何人除了通过AddCourse之外,还能向列表中添加任何内容吗?
在这种情况下,我建议的修复方法是将AddCourse更改为直接寻址字段而不是属性,因为当前它将项目添加到getter创建的新列表中,而不是添加到字段引用的列表中。

返回新列表(\u courses)get
中的code>始终返回一个新列表和
课程。Add
不调用
set
。您应该返回当前列表(
\u课程
),而不是@crashmstr所说的新列表。更简单的版本:
公共IList课程{get;set;}=new list()(这样您就不需要backing变量了,懒散地创建空列表在这里不会给您带来太多好处)。