You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#电影订票控制台应用:如何向Movie类的List<Show>属性添加演出列表?

电影订票控制台应用问题修复方案

问题1:Shows属性为空引发NullReferenceException

错误根源

  1. Movie类默认构造函数错误:
    原代码默认构造函数使用未定义的_shows参数,导致shows字段无法正确初始化:
    public Movie()
    {
        shows = new List<Show>(_shows); // _shows未定义,直接触发错误
    }
    
  2. addShow方法未确保Shows集合初始化:
    调用Shows.Add()前,若Shows未被赋值或初始化,会触发空引用异常。
  3. addMovie方法传参错误:
    创建Movie实例时传入movie.Shows,但此处movie变量未定义,实际传入空值,导致新Movie的Shows属性为空。

修复步骤

  1. 修正Movie类默认构造函数:
    直接初始化空的Show列表:
    public Movie()
    {
        shows = new List<Show>();
    }
    
  2. 给Shows属性添加懒加载逻辑:
    确保第一次访问Shows时自动初始化,避免空引用:
    public List<Show> Shows 
    { 
        get 
        { 
            if (shows == null)
                shows = new List<Show>();
            return shows; 
        }   
        set { shows = value; }
    }
    
  3. 修正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方法,无法展示演出的具体信息。

修复步骤

  1. 重写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}";
        }
    }
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:31:01