C# params 可变参数使用注意

今天在一个 .NET Core 项目中调用一个自己实现的使用 params 可变参数的方法时触发了 null 引用异常,原以为是方法中没有对参数进行 null 值检查引起的,于是加上 check null 代码:

public static void BuildBlogPostLinks(params BlogPostDto[] blogPosts)
{
    if (blogPosts == null)
        return;

    foreach (var blogPost in blogPosts)
    {
        //...
    }
}

结果却出人意料, null 引用异常继续,仔细看异常 stack 才发现原来 null 引用异常是在 foreach 时抛出的,需要在 foreach 时对 blogPost 进行 check null 。

下面的示例代码可以验证这一点

class Program
{
    static void Main(string[] args)
    {
        BuildBlogPostLinks(null);
        BlogPost blogPost = null;
        BuildBlogPostLinks(blogPost);
    }

    public static void BuildBlogPostLinks(params BlogPost[] blogPosts)
    {
        if (blogPosts == null)
        {
            Console.WriteLine("blogPosts in null");
            return;
        }

        foreach (var blogPost in blogPosts)
        {
            if (blogPost == null)
            {
                Console.WriteLine("blogPost in null");
            }
            else 
            {
                Console.WriteLine("blogpost.Title: " + blogPost.Title);
            }
        }
    }
}

public class BlogPost
{
    public string Title { get; set; }
}

运行时的输出结果是

$ dotnet run
blogPosts in null
blogPost in null
posted @ 2019-07-22 22:32  dudu  阅读(867)  评论(4编辑  收藏  举报