C#解析DateTime?类型时处理空值问题
处理可空DateTime的空值问题
你的代码里直接访问result.ReleaseDate.Value.Year,当ReleaseDate为null时会抛出NullReferenceException——因为可空类型的.Value属性不能在值为null时调用。下面是几种实用的处理方式:
方式一:用HasValue判断后取值
通过HasValue属性先检查是否有有效值,有值则取年份,无值显示友好的占位文本:
public void movieSearch(string mov) { SearchContainer<SearchMovie> results = client.SearchMovieAsync(mov).Result; Console.WriteLine($"Got {results.Results.Count:N0} of {results.TotalResults:N0} results"); foreach (SearchMovie result in results.Results) { string yearText = result.ReleaseDate.HasValue ? result.ReleaseDate.Value.Year.ToString() : "未公布"; Console.WriteLine($"Movie Title: {result.Title}, Movie ID: {result.Id}, Release Year: {yearText}"); } }
方式二:在字符串插值中直接用三元表达式
省去临时变量,直接在插值逻辑里完成判断:
public void movieSearch(string mov) { SearchContainer<SearchMovie> results = client.SearchMovieAsync(mov).Result; Console.WriteLine($"Got {results.Results.Count:N0} of {results.TotalResults:N0} results"); foreach (SearchMovie result in results.Results) Console.WriteLine($"Movie Title: {result.Title}, Movie ID: {result.Id}, Release Year: {result.ReleaseDate.HasValue ? result.ReleaseDate.Value.Year.ToString() : "未公布"}"); }
方式三:用模式匹配简化判断(C# 7.0及以上)
通过模式匹配直接解构可空值为DateTime类型,代码更简洁直观:
public void movieSearch(string mov) { SearchContainer<SearchMovie> results = client.SearchMovieAsync(mov).Result; Console.WriteLine($"Got {results.Results.Count:N0} of {results.TotalResults:N0} results"); foreach (SearchMovie result in results.Results) { string yearText = result.ReleaseDate is DateTime releaseDate ? releaseDate.Year.ToString() : "未公布"; Console.WriteLine($"Movie Title: {result.Title}, Movie ID: {result.Id}, Release Year: {yearText}"); } }
方式四:用GetValueOrDefault设置默认值(适合需要默认年份的场景)
如果希望null时返回一个默认年份(比如0),可以用GetValueOrDefault,但注意要处理默认值的显示:
public void movieSearch(string mov) { SearchContainer<SearchMovie> results = client.SearchMovieAsync(mov).Result; Console.WriteLine($"Got {results.Results.Count:N0} of {results.TotalResults:N0} results"); foreach (SearchMovie result in results.Results) { int year = result.ReleaseDate.GetValueOrDefault().Year; string yearText = year == 1 ? "未公布" : year.ToString(); // DateTime.MinValue的Year为1,需特殊处理 Console.WriteLine($"Movie Title: {result.Title}, Movie ID: {result.Id}, Release Year: {yearText}"); } }
内容的提问来源于stack exchange,提问作者ronniej962
相关产品推荐
相关产品推荐

