初始化属性的良好做法?

时间:2010-04-22 17:15:06

标签: c#

我有一个类属性,它是一个字符串列表List。 有时此属性为null或者如果已设置但列表为空,则count为0。 然而,在我的代码中的其他地方,我需要检查是否已设置此属性,因此当前我的代码检查它是否为null并且count为0,这看起来很混乱。

if(objectA.folders is null)
{
    if(objectA.folders.count == 0)
    {
      // do something
    }
}

有关如何处理此事的任何建议? 也许我应该总是初始化属性,以便它永远不会为空?

9 个答案:

答案 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)

您有三种选择(需要根据项目决定):

  1. 创建一个检查NullOrNoElements的方法。 Pro:允许null和no条目。 Con:您必须在任何想要使用该属性的地方调用它。
  2. 使用列表预初始化。 Pro:线程保存非常简单。 Con:即使不使用也会使用内存(具体取决于您拥有的实例数量可能有问题)
  3. 延迟初始化 Pro:仅在真正使用时才使用内存。 Con: 非线程保存。
  4. 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。这使得使用起来更容易。