我有一个类属性,它是一个字符串列表List。 有时此属性为null或者如果已设置但列表为空,则count为0。 然而,在我的代码中的其他地方,我需要检查是否已设置此属性,因此当前我的代码检查它是否为null并且count为0,这看起来很混乱。
if(objectA.folders is null)
{
if(objectA.folders.count == 0)
{
// do something
}
}
有关如何处理此事的任何建议? 也许我应该总是初始化属性,以便它永远不会为空?
答案 0 :(得分:5)
当我将List作为属性时,我通常会看到如下所示的内容(这不是一个线程安全的代码段):
public class SomeObject
{
private List<string> _myList = null;
public List<string> MyList
{
get
{
if(_myList == null)
_myList = new List<string>();
return _myList;
}
}
}
您的代码将永远不必检查null,因为如果使用属性将被初始化。然后,您只需要检查计数。
答案 1 :(得分:4)
现在你的代码总是会抛出一个Null Pointer异常,你正在检查Null,如果它是null,你正试图访问一个不存在的对象。
答案 2 :(得分:1)
如果对于您的应用程序,集合是空引用从不具有与集合为空的不同含义,那么是的,我会说您应该始终初始化它,这样就从剩余代码中删除空检查。
如果属性设置器在初始化后不允许将其更改为空引用,则此方法才有意义。
答案 3 :(得分:1)
您始终可以初始化该属性,因此它是一个空列表。然后你可以检查计数属性。
List<String> Folder = Enumerable.Empty<String>();
我曾经为ICollection对象编写了一个扩展方法,检查它们是否为null或空
public static Boolean IsNullOrEmpty<T>(this ICollection<T> collection)
{
return collection == null ? true : collection.Count() == 0;
}
public static Boolean IsPopulated<T>(this ICollection<T> collection)
{
return collection != null ? collection.Count() > 0 : false;
}
答案 4 :(得分:1)
您有三种选择(需要根据项目决定):
private List<string> lp = null; public List<string> ListProp { get { if(lp == null) lp = new List<string>(); return lp; } }
答案 5 :(得分:0)
您可以在单个IF中执行此操作
if(objectA.folders is null || objectA.folders.count == 0)
或者您可以在类中创建一个布尔属性,为您检查此状态并返回结果
public bool objectA.FolderIsNullOrEmpty
{
get { return objectA.folders is null || objectA.folders.count == 0;}
}
如果它对您的应用程序没有影响,我宁愿建议初始化List以开始。
答案 6 :(得分:0)
您可以通过在构造函数中初始化对象来处理此问题。这通常是完成此类事情的地方。虽然我认为您当前的代码没有任何问题。没有必要初始化那些尚不存在的东西,它只会浪费内存。
答案 7 :(得分:0)
这是一个很好的问题。我会向objectA FoldersNullOrEmpty()添加一个方法,你可以使用它,例如
public virtual FoldersNullOrEmpty()
{
return (folders == null || folders.count == 0)
}
答案 8 :(得分:0)
我几乎总是初始化列表,甚至确保如果任何setter暴露它们也不能设置为null。这使得使用起来更容易。