【问题标题】:Asp.NET return empy List<Object> C#Asp.NET 返回空 List<Object> C#
【发布时间】:2013-08-12 15:00:10
【问题描述】:

在我的 ASP.NET 经典 WebForms 应用程序中,我有一个返回 Role 对象列表的类,我使用这些对象映射数据库中用户的角色。

我写了这个静态类:

public static class RoleHelper
{
    public static List<RoleValue> getRoles()
    {
        List<RoleValue> myroles = null;
        string connectionString = ConfigurationManager.ConnectionStrings["SQLConnStr"].ConnectionString;
        if (!string.IsNullOrWhiteSpace(connectionString))
        {
            using (SqlConnection dbconn = new SqlConnection(connectionString))
            {
                dbconn.Open();
                SqlDataAdapter cmd = new SqlDataAdapter(" SELECT groupID,Name FROM Gruppi", dbconn);
                cmd.SelectCommand.CommandType = CommandType.Text;
                DataSet ds = new DataSet();
                cmd.Fill(ds);
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    myroles = new List<RoleValue>();

                    foreach (DataRow row in ds.Tables[0].Rows)
                    {
                        RoleValue myrole = new RoleValue();
                        myrole.roleID = (int)row["groupID"]; ;
                        myrole.roleName = (string)row["Name"]; ;
                        myroles.Add(myrole);
                    }
                }
                dbconn.Close();
            }
        }
        return myroles;
    }
}

起初我写道:

List(RoleValue) myroles = null; 

这是错的吗?

在调用函数中,我检查了if (rolesList.Count &gt; 0),但我应该检查if(!rolesList is null),但列表不允许为null?

【问题讨论】:

  • 我没问题。我只是怀疑正确的方法。

标签: c# list collections null return


【解决方案1】:

将列表初始化为null并没有错,但是这种方式用得比较广泛:

List<RoleValue> myroles = new List<RoleValue>();

然后你会返回列表,调用者会检查列表的长度以查看是否为空,如下所示:

List<RoleValue> listOfRoles = getRoles();

if(listOfRoles.Count == 0)
{
    // Report message to user if having no roles is worthy of a notification
}

null 相比,返回列表实例的优势在于,用户将执行的大多数操作都无需检查null,例如数据绑定和迭代列表。

【讨论】:

  • 返回null 通常用于表示错误。但这当然应该通过抛出异常来表示。
【解决方案2】:

我假设在正常情况下数据库访问是有效的,所以你会到达

myroles = new  List<RoleValue>();

因此,您可能会在顶部创建此实例,而不是

List<RoleValue> myroles = null;

优点:调用者可以遍历所有角色,如果集合为空,则根本不会创建输出。

【讨论】:

    【解决方案3】:

    按照惯例,您应该将其初始化为一个空列表,而不是null,并检查它是否有任何项目,而不是查看它是否是其他地方的null。这避免了使用该类型检查 null 的所有代码的需要,如果没有项目,大多数操作应该正常工作(即什么都不做),例如 foreach

    【讨论】:

      【解决方案4】:

      返回一个包含 0 个对象的列表和返回 null 都是完全有效的。您需要关注的是调用者对方法的期望。他们应该收到一个空列表吗?这将使他们不必先进行空检查。

      【讨论】:

        【解决方案5】:

        通常它可以为空。但我认为你的 if 子句总是正确的。这样这条线就会完成 myroles = new List();然后它不是空的。最好要求 .Count 属性

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-07-11
          • 2016-06-13
          • 2021-05-22
          • 2016-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多