在我的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 > 0)
但是我应该检查if(!rolesList is null)
但是列表不允许为空?
答案 0 :(得分:4)
将列表初始化为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
的情况下工作,例如数据绑定和迭代列表。
答案 1 :(得分:1)
我认为在正常情况下数据库访问有效,因此您将到达
myroles = new List<RoleValue>();
因此,您可以在顶部创建此实例,而不是
List<RoleValue> myroles = null;
优点:调用者可以遍历所有角色,如果集合为空,则不会创建任何输出。
答案 2 :(得分:0)
按照惯例,您应该将其初始化为空列表,而不是null
,并检查它是否包含任何项目,而不是在其他位置查看它是否为null
。这样可以防止需要使用类型来检查所有代码以检查null,大多数操作应正常工作(即无效),如果没有项目,例如foreach
。
答案 3 :(得分:0)
返回包含0个对象并返回null的列表都是完全有效的。您需要关注的是调用者对该方法的期望。他们应该收到空名单吗?这样他们就可以避免首先进行空检查。
答案 4 :(得分:0)
一般情况下,它可能为空。但我认为你的if子句总是正确的或者是......这样就行了myroles = new List();然后它不是空的。更好地要求.Count属性