C#电影订票控制台应用:如何向Movie类的List<Show>属性添加演出列表?
电影订票控制台应用问题修复方案
问题1:Shows属性为空引发NullReferenceException
错误根源
- Movie类默认构造函数错误:
原代码默认构造函数使用未定义的_shows参数,导致shows字段无法正确初始化:public Movie() { shows = new List<Show>(_shows); // _shows未定义,直接触发错误 } - addShow方法未确保Shows集合初始化:
调用Shows.Add()前,若Shows未被赋值或初始化,会触发空引用异常。 - addMovie方法传参错误:
创建Movie实例时传入movie.Shows,但此处movie变量未定义,实际传入空值,导致新Movie的Shows属性为空。
修复步骤
- 修正Movie类默认构造函数:
直接初始化空的Show列表:public Movie() { shows = new List<Show>(); } - 给Shows属性添加懒加载逻辑:
确保第一次访问Shows时自动初始化,避免空引用:public List<Show> Shows { get { if (shows == null) shows = new List<Show>(); return shows; } set { shows = value; } } - 修正addMovie方法的传参逻辑:
先创建并初始化演出列表,再传入Movie构造函数:public List<Movie> addMovie() { // 初始化当前电影的演出列表 List<Show> movieShows = new List<Show>(); movieShows.Add(new Show(DateTime.ParseExact("2024-12-11 05:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture), DateTime.ParseExact("2024-12-11 06:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture))); // 添加其他演出... Movie movie1 = new Movie("Romeo and Juliet: Afterlife", "Meadival Tragedy Romance", 300, "English", DateTime.ParseExact("2024-12-11 00:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture), "Romance", movieShows); movies.Add(movie1); Console.WriteLine("Add movies successfully!"); return movies; }
问题2:控制台输出显示System.Collections.Generic.List1[ASM_TicketBooking.Show]`而非具体演出信息
错误根源
直接输出movie.Shows时,C#会调用List的默认ToString方法,仅返回类型名称;同时Show类未重写ToString方法,无法展示演出的具体信息。
修复步骤
- 重写Show类的ToString方法:
让Show实例输出自身关键信息:internal class Show { public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public Show(DateTime startTime, DateTime endTime) { StartTime = startTime; EndTime = endTime; } public override string ToString() { return $"开始时间: {StartTime:yyyy-MM-dd HH:mm}, 结束时间: {EndTime:yyyy-MM-dd HH:mm}"; } } - 修改getMovies方法,遍历Shows列表输出:
循环遍历每个Show并打印,替代直接输出列表对象:public void getMovies() { foreach (Movie movie in movies) { Console.WriteLine($"Movie Title: {movie.Title}"); Console.WriteLine($"Description: {movie.Description}"); Console.WriteLine($"Duration: {movie.DurationMins}分钟"); Console.WriteLine($"Language: {movie.Language}"); Console.WriteLine($"Genre: {movie.Genre}"); Console.WriteLine($"Release Date: {movie.ReleaseDate:yyyy-MM-dd}"); Console.WriteLine("演出信息:"); if (movie.Shows != null && movie.Shows.Count > 0) { foreach (Show show in movie.Shows) { Console.WriteLine($" - {show}"); } } else { Console.WriteLine(" 暂无演出安排"); } Console.WriteLine("------------------------"); } }
额外优化建议
- 使用C#自动属性简化Movie类代码,减少冗余私有字段:
internal class Movie { public string Title { get; set; } public string Description { get; set; } public int DurationMins { get; set; } public string Language { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public List<Show> Shows { get; set; } = new List<Show>(); // 直接初始化列表 public Movie() { } public Movie(string title, string description, int durationMins, string language, DateTime releaseDate, string genre, List<Show> shows) { Title = title; Description = description; DurationMins = durationMins; Language = language; ReleaseDate = releaseDate; Genre = genre; Shows = shows ?? new List<Show>(); // 防止传入null } } - 方法名遵循C# PascalCase命名规范,改为
AddShow、AddMovie、GetMovies。
内容的提问来源于stack exchange,提问作者quang thang
相关产品推荐
相关产品推荐

